标签:span 结果 枚举 its names black img using ack
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640
这样阴沉的天气持续下去,我们不免担心起他的健康。
两个正整数N,M。(1 <= N <= 10^5, N <= M <= 2 * 10^5) 接下来M行,每一行有三个整数A, B, V。(1 <= A, B <= N, INT_MIN <= V <= INT_MAX) 保证输入数据合法。
输出一个正整数R,表示符合条件的魔法阵的魔力值之和。
4 6 1 2 3 1 3 1 1 4 7 2 3 4 2 4 5 3 4 6
12
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 struct Edge 5 { 6 int u,v,w; 7 bool operator<(const Edge &t)const{ 8 return w<t.w; 9 } 10 }e[200005]; 11 int f[100005]; 12 int getf(int v){return f[v]==v?f[v]:f[v]=getf(f[v]);} 13 bool ok(int k,int N,int M) 14 { 15 for(int i=1;i<=N;++i) f[i]=i; 16 for(int i=0;i<M&&e[i].w<=k;i++){ 17 int fu=getf(e[i].u),fv=getf(e[i].v); 18 if(fv!=fu){ 19 N--; 20 f[fv]=fu; 21 } 22 if(N==1) return 1; 23 } 24 return 0; 25 } 26 int main() 27 { 28 int N,M,i,j,l=2147483647,r=0; 29 cin>>N>>M; 30 for(i=0;i<M;++i){ 31 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); 32 l=min(l,e[i].w); 33 r=max(r,e[i].w); 34 } 35 sort(e,e+M); 36 LL ans=0; 37 while(l<r){ 38 int mid=l+((r-l)>>1); 39 if(ok(mid,N,M)){ 40 r=mid; 41 } 42 else{ 43 l=mid+1; 44 } 45 } 46 for(int i=1;i<=N;++i) f[i]=i; 47 Edge e1{-1,-1,l}; 48 int ed=upper_bound(e,e+M+1,e1)-e; 49 for(int i=ed;i>=0;--i){ 50 if(e[i].w>l) continue; 51 int fu=getf(e[i].u),fv=getf(e[i].v); 52 if(fv!=fu){ 53 ans+=e[i].w; 54 N--; 55 f[fv]=fu; 56 } 57 if(N==1) break; 58 } 59 printf("%lld\n",ans); 60 return 0; 61 }
标签:span 结果 枚举 its names black img using ack
原文地址:http://www.cnblogs.com/zzqc/p/7352406.html