ZOJ 2048 Highways【kruskal】
2011-08-11 21:42
417 查看
2623181 2011-08-11 21:41:26 Accepted 2048 C++ 910 3492 ylwh@Unknown #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define N 751 #define M 1001 struct node { int x, y, root; }s ; struct edge { int len, x, y; }e[N*N/2]; int cmp(struct edge a, struct edge b) { return a.len < b.len; } int cmp2(struct edge a, struct edge b) { return a.x < b.x; } int find_root(int x) { int temp = x;; while(x != s[x].root) x = s[x].root; s[temp].root = x; return x; } int main(void) { int t, n, m, i, j, k, cnt; scanf("%d", &t); while(t--) { scanf("%d", &n); for(i=1; i<=n; i++) { scanf("%d%d", &s[i].x, &s[i].y); s[i].root = i; } cnt = -1; for(i=1; i<=n; i++) for(j=i+1; j<=n; j++) { e[++cnt].x = i; e[cnt].y = j; e[cnt].len = (s[i].x - s[j].x) * (s[i].x - s[j].x) + (s[i].y - s[j].y) * (s[i].y - s[j].y); } sort(e, e+cnt+1, cmp); scanf("%d", &m); int a, b; for(i=1; i<=m; i++) { scanf("%d%d", &j, &k); a = find_root(j); b = find_root(k); if(a > b) s[a].root = b; else s[b].root = a; } int top = -1; for(i=0; i<=cnt; i++) { a = find_root(e[i].x); b = find_root(e[i].y); if( a != b ) { if(a > b) s[a].root = b; else s[b].root = a; e[++top].x = e[i].x; e[top].y = e[i].y; } } sort(e, e+top+1, cmp2); for(i=0; i<=top; i++) printf("%d %d\n", e[i].x, e[i].y); if(t)printf("\n"); } return 0; }
相关文章推荐
- zoj 2048 Highways(Kruskal~)
- ZOJ 2048 / POJ 2485 Highways ( kruskal )
- ZOJ 2048 Highways 最小生成树 Kruskal && Prim
- zoj - 2048 - Highways
- zoj 2048 Highways
- zoj - 2048 - Highways
- POJ 1751 Highways (ZOJ 2048 ) MST
- POJ 1751 Highways (ZOJ 2048 ) MST
- 最小生成树-并查集-Kruskal-zoj-2048-special judge
- ZOJ 2048 POJ 1751 Highways
- ZOJ 2048 Highways
- ZOJ 2048 Highways
- zoj 2048 && poj 1751 Highways
- 最小生成树-并查集-Kruskal-zoj-2048-special judge
- zoj 2048 - Highways
- zoj 2048 Highways
- ZOJ 2048 :Highways 【Prim】
- zoj 2048 Highways(最小生成树)
- ZOJ 2048 highways
- ZOJ 2048 highways