UVa 10600 ACM contest and Blackout( 次小生成树)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define INF 0xffffff
 5 #define maxn 105
 6 using namespace std;
 7 int f[maxn],ise[maxn],t,n,m;
 8 typedef struct
 9 {
10     int x,y,w;
11 }Edge;
12 Edge e[maxn];
13 int find(int x)
14 {
15     if(f[x]!=x)
16         f[x]=find(f[x]);
17     return f[x];
18 }
19 int cmp(Edge a,Edge b)
20 {
21     return a.w<b.w?1:0;
22 }
23 int kru()
24 {
25     int ans=0,id=0;
26     for(int i=1;i<=n;i++)
27         f[i]=i;
28     for(int i=1;i<=m;i++)
29     {
30         int f1=find(e[i].x);
31         int f2=find(e[i].y);
32         if(f1!=f2)
33         {
34             f[f1]=f2;
35             ans+=e[i].w;
36             ise[id++]=i;
37         }
38     }
39     return ans;
40 }
41 int kru1(int del)
42 {
43     int ans=0;
44     for(int i=1;i<=n;i++)
45         f[i]=i;
46     for(int i=1;i<=m;i++)
47     {
48         if(i==del)
49             continue;
50         int f1=find(e[i].x);
51         int f2=find(e[i].y);
52         if(f1!=f2)
53         {
54             f[f1]=f2;
55             ans+=e[i].w;
56         }
57     }
58     return ans;
59 }
60 int main()
61 {
62     //freopen("in.txt","r",stdin);
63     scanf("%d",&t);
64     while(t--)
65     {
66         scanf("%d%d",&n,&m);
67         for(int i=1;i<=m;i++)
68             scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
69         sort(e+1,e+m+1,cmp);
70         int ans1=kru(),ans2=INF;
71         for(int i=1;i<n-1;i++)
72         {
73             int x=ise[i];
74             ans2=min(ans2,kru1(x));
75         }
76         printf("%d %d\n",ans1,ans2);
77     }
78     return 0;
79 }

 

posted @ 2014-03-12 16:44  清风旋叶  阅读(213)  评论(0编辑  收藏  举报