标签:ble def ons scan max ios ++ 位置 nio
https://codeforces.com/group/5yyKg9gx7m/contest/270203/problem/A
分析:
代码:
#include <cstdio> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; const int maxn=1e5+6; struct cop { int u,v; int w; }c[maxn]; int p[maxn]; int a[maxn]; int fa[maxn]; int n,m; int dis; int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } void Union(int x,int y) { x=find(x),y=find(y); fa[x]=y; } bool same(int x,int y) { return find(x)==find(y); } bool judge(int x) { for(int i=1;i<=n;i++) fa[i]=i;//初始化 for(int i=x;i<=m;i++) { Union(c[i].u,c[i].v); } for(int i=1;i<=dis;i++) { if(!same(a[p[i]],p[i])) return 0; } return 1; } bool cmp(struct cop a,struct cop b) { return a.w<b.w; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]!=i) p[++dis]=i; } for(int i=1;i<=m;i++) { scanf("%d %d %d",&c[i].u,&c[i].v,&c[i].w); } if(!dis) { printf("-1\n"); return 0; } sort(c+1,c+m+1,cmp); int l=1,r=m; int mid=(l+r)>>1; while(l<=r) { mid=(l+r)>>1; if(judge(mid)) l=mid+1; else r=mid-1; } cout<<c[l-1].w<<endl; return 0; }
标签:ble def ons scan max ios ++ 位置 nio
原文地址:https://www.cnblogs.com/studyshare777/p/12404921.html