HDU1879

已经建的边两个端点合并一下再跑Kruscal就好了

注意:cin会被卡

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 struct node{
 5     int from,to,w;
 6     bool operator < (const node &a){
 7         return w<a.w;
 8     }
 9 }a[10010];
10 int n,m,u,v,w,x,f[101],ans;
11 
12 void ini(){
13     for (int i=1;i<=n;i++) f[i]=i;
14     ans=0;
15 }
16 
17 int getf(int u){
18     return f[u]==u?f[u]:f[u]=getf(f[u]);
19 }
20 
21 void merge(int u,int v){
22     f[getf(u)]=getf(v);
23 }
24 
25 void solve(){
26     while (scanf("%d",&n)!=EOF){
27         if (n==0) break;
28         ini();
29         m=n*(n-1)/2;
30         for (int i=1;i<=m;i++){
31             scanf("%d %d %d %d",&u,&v,&w,&x);
32             a[i]={u,v,w};
33             if (x) merge(u,v);
34         }
35         sort(a+1,a+1+m);
36         for (int i=1;i<=m;i++){
37             if (getf(a[i].from)!=getf(a[i].to)){
38                 ans+=a[i].w;
39                 merge(a[i].from,a[i].to);
40             }
41         }
42         cout<<ans<<endl;
43     }
44 }
45 
46 int main()
47 {
48     solve();
49     return 0;
50 }

 

posted @ 2020-05-01 12:13  White_Li  阅读(153)  评论(0)    收藏  举报