您的位置:首页 > 编程语言 > Go语言

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct algorithm c