51 Nod 1640 天气晴朗的魔法
作者:互联网
大意: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