随笔 - 40, 文章 - 0, 评论 - 19, 引用 - 0
数据加载中……

Kruskal+并查集 第一次写 1A 很高兴

 1 #include<string.h>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 
 7 struct edg{
 8     int x ;
 9     int y ;
10     int len;
11 }a[200000];
12 int flag[200000];
13 int cmp (edg aa ,edg bb){
14     return aa.len<bb.len;
15 }
16 
17 int find(int pot){
18     if(flag[pot] == -1){
19         return pot;
20     }
21     else{
22         return flag[pot] = find(flag[pot]);
23     }
24 }
25 void Union(int p1 , int p2){
26     flag[find(p2)] = find(p1);
27 }
28 
29 int add(edg t){
30    // printf("t.x t.y  %d %d\n",t.x,t.y);
31     if( find(t.x) != find(t.y)){
32         Union(t.x,t.y);
33    //     printf("f.x f.y  %d %d\n",flag[t.x],flag[t.y]);
34         return t.len;
35     }
36     else{
37         return 0;
38     }
39 }
40 
41 int n , m;
42 int main(){
43     while(1){
44     scanf("%d%d",&n,&m);
45     int sum1 = 0;
46     if(n == m && m == 0break;
47     memset(flag,-1,sizeof(flag));
48         for(int i = 0 ; i < m ; i++){
49             scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].len);
50             sum1 += a[i].len;
51         }
52         sort(a,a+m,cmp);
53         int ans = 0;
54         int sum = 0;
55         for(int i = 0 ; i < m ; i++){
56            if(ans == n+1 ) break;
57          //  printf("ans a[i]   %d %d %d\n",a[i].x,a[i].y,a[i].len);
58            int now = add(a[i]);
59            if(now){
60                 sum += now;
61                 ans++;
62            }
63         }
64         printf("%d\n",sum1-sum);
65     }
66     return 0;
67 }
68 

posted on 2009-07-24 15:46 hadn't 阅读(160) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理