Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:论看memory limit的重要性,九千多k水过水过~In Reply To:论看memory limit的重要性,九千多k Posted by:miubiu at 2018-01-24 15:44:50 > //~ #define LOCAL > > #include<cstdio> > #include<vector> > #include<algorithm> > #include<cmath> > > using namespace std; > > #define rep(a, b) for(int i = a; i <= b; i++) > > const int MAX = 800; > > bool store[MAX][MAX]; > int rcnt; > > struct Point > { > int u, v; > int x, y; > } s[MAX], road[MAX]; > > struct Ufs > { > int prt[MAX]; > > void init(int n) > { > rep(1, n) > prt[i] = i; > return; > } > > int findprt(int x) > { > while(x != prt[x]) > x = prt[x]; > return x; > } > > bool unite(int x, int y) > { > int px = findprt(x); > int py = findprt(y); > prt[x] = prt[y] = prt[px] = prt[py] = min(px, py); > return px != py; > } > }; > > struct Kruskal > { > struct Edge > { > int u, v; > double w; > Edge(int uu, int vv, double ww):u(uu), v(vv), w(ww){} > friend bool operator <(Edge a, Edge b) > { > return a.w < b.w; > } > }; > > vector<Edge> e; > Ufs u; > > void init(void) > { > e.clear(); > } > > void addedge(int u, int v, double w) > { > e.push_back(Edge(u, v, w)); > return; > } > > void solve(int n) > { > int cnt = 0; > u.init(n); > int len = e.size(); > sort(e.begin(), e.end()); > rep(0, len - 1) > { > if(u.unite(e[i].u, e[i].v)) > { > cnt++; > if(e[i].w != 0) > { > road[rcnt].u = e[i].u; > road[rcnt++].v = e[i].v; > } > } > if(cnt == n - 1) > break; > } > } > } k; > > int main() > { > > #ifdef LOCAL > freopen("in.txt", "r", stdin); > #endif > > int n; > scanf("%d", &n); > rep(1, n) > scanf("%d%d", &s[i].x, &s[i].y); > > int tmpnum; > scanf("%d", &tmpnum); > while(tmpnum--) > { > int u, v; > scanf("%d%d", &u, &v); > store[u][v] = store[v][u] = true; > } > > rep(1, n - 1) > for(int j = i + 1; j <= n; j++) > if(!store[i][j]) > { > double tmp = sqrt((double)(s[i].x - s[j].x) * (double)(s[i].x - s[j].x) + (double)(s[i].y - s[j].y) * (double)(s[i].y - s[j].y)); > k.addedge(i, j, tmp); > } > else > k.addedge(i, j, 0); > > k.solve(n); > > rep(0, rcnt - 1) > printf("%d %d\n", road[i].u, road[i].v); > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator