| ||||||||||
| 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 | |||||||||
用 Prim 都过了,Kruskal 咋不行啊?#include<stdio.h>
struct TEdge {
int a, b, dist;
};
int N, Q, adj[1000][1000];
int UFS[1000];
struct TEdge e[1000];
int num, ans;
int cmp(struct TEdge *a, struct TEdge *b)
{
return (a -> dist - b -> dist);
}
int root(int i)
{
if (UFS[i] == -1)
return (i);
else
return (root(UFS[i]));
}
int equal(int i, int j)
{
return (root(i) == root(j));
}
void _union(int i, int j)
{
UFS[root(j)] = root(i);
}
int main()
{
int i, j, a, b;
scanf("%d", &N);
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &adj[i][j]);
memset(UFS, -1, sizeof(UFS));
scanf("%d", &Q);
for (i = 0; i < Q; i++) {
scanf("%d %d", &a, &b);
if (!equal(a - 1, b - 1))
_union(a - 1, b - 1);
}
num = 0;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
if (adj[i][j]) {
e[num].a = i;
e[num].b = j;
e[num].dist = adj[i][j];
num++;
}
qsort(e, num, sizeof(e[0]), cmp);
ans = 0;
for (i = 0; i < num; i++)
if (!equal(e[i].a, e[i].b)) {
_union(e[i].a, e[i].b);
ans += e[i].dist;
}
printf("%d\n", ans);
system("pause");
return (0);
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator