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\n",sum);

41     }

42     return 0;

43 }
View Code

 

你可能感兴趣的:(HDU)