P1525 关押罪犯 题解
Posted fallen-down
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1525 关押罪犯 题解相关的知识,希望对你有一定的参考价值。
前提:我是傻子,上赶挨骂,对不起了,污您眼了
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 //带边权的并查集+贪心 6 /* 7 根据贪心可以知道,当把仇恨值大的先分开放就会最优 8 所以还要用sort 9 */ 10 int fa[20001],n,m; 11 struct ziji{ 12 int x,y,z; 13 #define x(i) mn[i].x 14 #define y(i) mn[i].y 15 #define z(i) mn[i].z 16 }mn[100001]; 17 int name[100001]; 18 inline int father(int v){ 19 if(v==fa[v]) return v; 20 else return father(fa[v]); 21 } 22 void chuli(int n){ 23 for(register int i=1;i<=n;i++) fa[i]=i; 24 } 25 void message(int a,int b){ 26 int root=father(a),root1=father(b); 27 fa[root]=root1; 28 } 29 bool check(int a,int b){ 30 //看看这俩是否在一个监狱里 31 int root=father(a),root1=father(b); 32 if(root==root1) return false; 33 else return true; 34 } 35 bool cmp(ziji a,ziji b){return a.z>b.z;} 36 int main(){ 37 scanf("%d%d",&n,&m);chuli(n); 38 for(int i=1;i<=m;i++) scanf("%d%d%d",&x(i),&y(i),&z(i)); 39 sort(mn+1,mn+1+m,cmp); 40 for(register int i=1;i<=m+1;i++){ 41 //当找到m+1时,x(i)与y(i)都是0,所以此时也就会输出0 42 if(check(x(i),y(i))==false){ 43 printf("%d ",z(i));return 0; 44 }//如果这俩已经在一个监狱里了,就输出 45 if(!name[x(i)]) name[x(i)]=y(i);//如果x(i)还没有过敌人,就把他的敌人设为y(i) 46 //此时这俩不在一个监狱里,也不用合并 47 else message(name[x(i)],y(i)); 48 //他已经有死敌了,又因为这是把敌对值从大到小排序, 49 //所以把他上次的敌人和这次的敌人合并就会更好 50 if(!name[y(i)]) name[y(i)]=x(i); 51 else message(name[y(i)],x(i)); 52 } 53 }
以上是关于P1525 关押罪犯 题解的主要内容,如果未能解决你的问题,请参考以下文章