HDU 1863 Kruskal求最小生成树

好久没写博客了写着玩的……

Kruskal这种东西离散都学过……

一句话……

添加当前图权值最小且构不成环的一条边 直到连接所有点……

其他人好多Kruskal的模版 肯定有比我的好的……

就是刷一波存在感……

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #define maxn 101
 4 
 5 using namespace std;
 6 
 7 int vis[maxn];
 8 int num,sum;
 9 
10 struct edge{
11     int a;
12     int b;
13     int value;
14 }p[maxn*maxn];
15 
16 int find_(int x){
17     int r=x;
18     while(r!=vis[r]){
19         r=vis[r];
20     }
21     return r;
22 }
23 
24 void Kruskal(int x,int y,int z){
25     int x1=find_(x);
26     int y1=find_(y);
27     if(x1!=y1){
28         vis[x1]=y1;
29         sum+=z;
30         num++;
31     }
32 }
33 
34 bool cmp(const edge &a, const edge &b){
35     return a.value < b.value;
36 }
37 
38 int main(){
39     int n,m,i;
40     while(~scanf("%d%d",&n,&m)&&n){
41         for(i=0;i<=m;i++)
42             vis[i]=i;
43         for(i=0;i<n;i++)
44             scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].value);
45         sum=0;
46         num=0;
47         sort(p,p+n,cmp);
48         for(i=0;i<n&&num<m-1;i++)
49             Kruskal(p[i].a,p[i].b,p[i].value);
50         if(num==m-1) printf("%d\n",sum);
51         else printf("?\n");
52     }
53     return 0;
54 }

 

posted @ 2016-07-05 12:07  良将ℓ  阅读(143)  评论(0编辑  收藏  举报