hdu 1879 继续畅通工程

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

这道题可以把已修建的道路的费用置为0,然后用prim和kruskal都可以求出。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 20000
 5 using namespace std;
 6 
 7 int u[maxn],v[maxn],r[maxn],s[maxn],f[maxn],w[maxn];
 8 int dis[maxn];
 9 bool vis[maxn];
10 int sum=0,n;
11 int cmp(const int i,const int j) {return w[i]<w[j];}
12 int Find(int x) {return f[x]==x?x:f[x]=Find(f[x]);}
13 
14 int main()
15 {
16     while(scanf("%d",&n)!=EOF)
17     {
18         memset(u,0,sizeof(u));
19         memset(v,0,sizeof(v));
20         memset(s,0,sizeof(s));
21         if(n==0) break;
22         sum=0;
23         for(int i=0; i<n*(n-1)/2; i++)
24         {
25             scanf("%d%d%d%d",&u[i],&v[i],&w[i],&s[i]);
26             if(s[i]==1) w[i]=0;
27         }
28         for(int i=0; i<=n; i++) f[i]=i;
29         for(int i=0; i<n*(n-1)/2; i++) r[i]=i;
30         sort(r,r+n*(n-1)/2,cmp);
31         for(int i=0; i<n*(n-1)/2; i++)
32         {
33             int e=r[i]; int x=Find(u[e]); int y=Find(v[e]);
34             if(x!=y)
35             {
36                 sum+=w[e];
37                 f[x]=y;
38             }
39         }
40         printf("%d
",sum);
41     }
42     return 0;
43 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/3667250.html