其他分享
首页 > 其他分享> > 51 Nod 1640 天气晴朗的魔法

51 Nod 1640 天气晴朗的魔法

作者:互联网

原题链接:题目-天气晴朗的魔法 (51nod.com)

大意:4个点,6条边,找到一条路,每条链的权值的最大值尽可能的小同时我们有要使魔力值之和尽可能的大。

思路:权值的最大值尽可能的小<=>求出其的最小的生成树,找到其权值最大的那条边达到了最大值尽可能的小,魔力值最大那么我们就可以找以这条权值最大的边的最大生成树。

 

 1 #include <iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1e5+10,M=2e5+10;
 6 int p[N];
 7 int n,m;
 8 struct E
 9 {
10     int a,b,w;
11 }e[M];
12 
13 bool cmp(E x,E y)
14 {
15     return x.w<y.w;
16 }
17 
18 int find(int x)
19 {
20     if(p[x]!=x) p[x]=find(p[x]);
21     return p[x];
22 }
23 
24 long long  kru()
25 {
26     int res=-9999999,op=-1,num=0;
27     sort(e,e+m,cmp);
28     for(int i=1;i<=n;i++) p[i]=i;
29     for(int i=0;i<m;i++)
30     {
31         int a=e[i].a,b=e[i].b,w=e[i].w;
32         a=find(a),b=find(b);
33         if(a!=b)
34         {
35             p[a]=b;
36             if(w>res)
37             {
38                 res=w;
39                 op=i;
40             }
41          } 
42          if(w==res&&op!=i) 
43             op=i; 
44     }
45     num=0;
46     long long  sum=0;
47     memset(p,0,sizeof p);
48     for(int i=1;i<=n;i++) p[i]=i;
49      for(int i=op;i>=0;i--)
50     {
51         int a=e[i].a,b=e[i].b,w=e[i].w;
52         a=find(a),b=find(b);
53         if(a!=b)
54         {
55             p[a]=b;
56             sum+=w;
57             num++;
58          } 
59          if(num==n-1) break;
60     }
61     return sum;
62 }
63 int main() { 
64  
65    scanf("%d%d",&n,&m);
66     for(int i=0;i<m;i++)
67     {
68         scanf("%d %d %d",&e[i].a,&e[i].b,&e[i].w);
69      } 
70     long long t=kru();
71     printf("%lld",t);
72     return 0;
73 }

 

标签:1640,Nod,sum,51,int,num,权值,include,op
来源: https://www.cnblogs.com/acmzk/p/16475645.html