洛谷P1525.关押罪犯
-
贪心 + 并查集
-
将数据按z排序后
- 对于每一对罪犯,如果已经连接了就说明当前罪恶值为最大,直接输出
- 如果没有连接,就应该和敌人的敌人连接在一起
-
#include <bits/stdc++.h> using namespace std; struct date {int x,y,z;}; date f[100005]; int n,m,p[20005],b[20005],i; bool cmp(date a,date b) { return a.z>b.z; } int find(int x) { if(p[x]==x) return x; p[x]=find(p[x]); return p[x]; } void ad(int x,int y)//合并 { x=find(p[x]); y=find(p[y]); p[x]=y; } bool check(int x,int y) { x=find(x); y=find(y); if(x==y) return true; return false; } int main() { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) p[i]=i; for(i=1;i<=m;i++) scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].z); sort(f+1,f+m+1,cmp); for(i=1;i<=m+1;i++) { //如果已经连接上了直接输出 if(check(f[i].x,f[i].y)) { cout<<f[i].z<<endl; break; } else { //标记“敌人” if(!b[f[i].x]) b[f[i].x]=f[i].y; //将敌人的敌人合并 else {ad(b[f[i].x],f[i].y);} //如果没有敌人就记录当前这个为敌人 if(!b[f[i].y]) b[f[i].y]=f[i].x; else {ad(b[f[i].y],f[i].x);} } } return 0; }