关押罪犯解题报告

来源:互联网 发布:win平板cad软件 编辑:程序博客网 时间:2024/05/07 01:04

       典型的并查集,还是很不错的一道题,由于我是刚做完团伙后做的,所以很快有了思路。首先建立一个敌人的集合,根据怨气值排序,再根据敌人的敌人就是我的朋友的原则,将一个罪犯与另一个敌人的集合合并,若两人在同一集合就输出他们的怨气值。后看了大牛的思路是直接开两倍的数组,一半表示敌对关系。以下是改进后的代码:

#include<iostream>#include<algorithm>using namespace std;int f[50000];struct edge{int a;int b;int c;}p[100010];int cmp(edge x,edge y){return x.c>y.c;}int find(int x){if(f[x]==x)return x;return find(f[x]);}int main(){int n,m,x,y;cin>>n>>m;for(int i=1;i<=m;i++)cin>>p[i].a>>p[i].b>>p[i].c;for(int i=1;i<=2*n;i++)f[i]=i;sort(p+1,p+m+1,cmp);for(int i=1;i<=m;i++){x=find(p[i].a);y=find(p[i].b);if(x==y){cout<<p[i].c;return 0;}f[p[i].a]=find(p[i].b+n); f[p[i].b]=find(p[i].a+n);}return 0; } 

   

0 0
原创粉丝点击