HDU 1879 继续畅通工程

Portal:http://acm.hdu.edu.cn/showproblem.php?pid=1879

。。。畅通工程没完没了了

kruskal+并查集

又给出了所有村庄间的距离,保证所有村庄在一个强连通分量里,所以直接kruskal

建好的路建造代价为0

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<set>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<vector>
 8 using namespace std;
 9 #define FOR(i,j,k) for(int i=j;i<=k;i++)
10 #define FORD(i,j,k) for(int i=j;i>=k;i--)
11 #define LL long long
12 #define maxnn 10110
13 #define maxn 110
14 struct edge{int u,v,cost;};
15 edge bb[maxnn];
16 int father[maxn],val[maxn];
17 int n,x,y,z,q,k,ans;
18 void setinit()
19 {
20     FOR(i,1,n)
21     {father[i]=i; val[i]=1;}
22 }
23 int setfind(int x)
24 {
25     int fa=father[x];
26     if(fa==x) return x;
27     else return father[x]=setfind(fa);
28 }
29 bool setunion(int xx,int yy)
30 {
31     int XX=setfind(xx);
32     int YY=setfind(yy);
33     if(XX==YY) return false;
34     if(val[XX]>val[YY]) father[YY]=XX;
35     else father[XX]=YY;
36     if(val[XX]=val[YY]) val[XX]++;
37     return true;
38 }
39 bool cmp1(edge a,edge b)
40 {
41     return a.cost<b.cost;
42 }
43 void kruskal()
44 {
45     sort(bb+1,bb+k+1,cmp1);
46     FOR(i,1,k)
47     if(setunion(bb[i].u,bb[i].v)) ans+=bb[i].cost;
48 }
49 int main()
50 {
51 for(cin>>n;n!=0;cin>>n)
52 {
53     k=n*(n-1)/2;
54     FOR(i,1,n*(n-1)/2)    
55     {
56         scanf("%d%d%d%d",&x,&y,&z,&q);
57         bb[i].u=x;
58         bb[i].v=y;
59         if(q) bb[i].cost=0;
60         else bb[i].cost=z;
61     }
62     setinit();
63     ans=0;
64     kruskal();
65     cout<<ans<<endl;
66 }
67 return 0;
68 }
1233的代码改一改交上去就AC了

 

posted @ 2016-07-05 22:46  MukoiAoi  阅读(124)  评论(0编辑  收藏  举报