AccecptTime: 2008-12-18 15:29:04 2008-12-18 15:44:33
Language: C++
Memory: 600K 688K
Time: 375MS 297MS
Errors: 2 WA
Algorithm: 最小生成树 Kruskal
- //这段代码用Kruskal来解决
- #include <stdio.h>
- #include <stdlib.h>
- // 边类型
- typedef struct Edge{
- int x;
- int y;
- int weigh;
- }Edge;
- //最多可能的边
- Edge edge[251001];
- int parent[501];
- //用于qsort()的比较函数
- int compare(const void*a,const void *b)
- {
- return ((Edge*)a)->weigh - ((Edge*)b)->weigh;
- }
- // 找父节点并压缩路径
- int FindParent(int x)
- {
- if( parent[x] != x)
- parent[x] = FindParent(parent[x]);
- else
- return x;
- return parent[x];
- }
- // 合并集合
- void MergeSet(int x,int y)
- {
- x = FindParent(x);
- y = FindParent(y);
- if( x > y)
- parent[y] = x;
- else
- parent[x] = y;
- }
- int main()
- {
- int m,n;
- int count = 0;
- scanf("%d",&n);
- for( int i = 0; i < n; i++) {
- scanf("%d",&m);
- for( int j = 0; j < m; j++)
- parent[j] = j;
- for( int j = 0; j < m; j++)
- for( int k = 0; k < m; k++) {
- scanf("%d",&edge[count].weigh);
- edge[count].x = j;
- edge[count++].y = k;
- }
- qsort(edge,m * m,sizeof(Edge),compare);
- count = 1;
- int max;
- // 忽略那些为0的节点,有m个,然后从小到大去边
- for( int j = m; j < (m * m) && count < m; j++)
- if(FindParent(edge[j].x) != FindParent(edge[j].y)) {
- count ++;
- MergeSet(edge[j].x,edge[j].y);
- max = edge[j].weigh;
- }
- printf("%d/n",max);
- }
- }
这道题中Kruskal算法体现出了它的优越性,比Prim算法快了30%~~