您的位置:首页 > 其它

51nod-1640--天气晴朗的魔法(简单最小生成树)

2017-04-19 22:21 393 查看
1640 天气晴朗的魔法
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MAXN=100000+30;
4 const int MAXM=2*MAXN+30;
5 int f[MAXN];
6 struct edge
7 {
8     int u,v;
9     long long w;
10 }e[MAXM];
11 int tot;
12 void addedge(int v,int u,int w)
13 {
14     e[tot].v=v;
15     e[tot].u=u;
16     e[tot].w=w;
17     tot++;
18 }
19 int fin(int x)
20 {
21     if(f[x]==-1)
22         return x;
23     else{
24         f[x]=fin(f[x]);
25         return f[x];
26     }
27 }
28 bool cmp(edge a,edge b)
29 {
30     return a.w<b.w;
31 }
32 long long kru(int n)
33 {
34     memset(f,-1,sizeof(f));
35     sort(e,e+tot,cmp);
36     long long num=0,ans=0;
37     int u,v,w;
38     int i;
39     for(i=0;i<tot;i++){
40         u=e[i].u,v=e[i].v,w=e[i].w;
41         int t1=fin(u);
42         int t2=fin(v);
43         if(t1!=t2){
44             num++;
45             f[t2]=t1;
46         }
47         if(num==n-1) break;
48     }
49     num=0;
50     memset(f,-1,sizeof(f));
51     while(e[i].w==e[i+1].w){
52         i++;
53     }
54     for(;i>=0;i--){
55         u=e[i].u,v=e[i].v,w=e[i].w;
56         int t1=fin(u);
57         int t2=fin(v);
58         if(t1!=t2){
59             num++;
60             ans+=w;
61             f[t2]=t1;
62         }
63         if(num==n-1) break;
64     }
65     if(num<n-1) return -1;
66     else return ans;
67 }
68 int main()
69 {
70     //freopen("data.in","r",stdin);
71     int n,m;
72     int a,b;
73     long long v;
74     tot=0;
75     scanf("%d%d",&n,&m);
76     for(int i=0;i<m;i++){
77         scanf("%d%d%lld",&a,&b,&v);
78         addedge(a,b,v);
79     }
80     //printf("%lld\n",kru(n));
81     cout<<kru(n)<<endl;
82 }
83
View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: