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 关押罪犯 题解的主要内容,如果未能解决你的问题,请参考以下文章

P1525 关押罪犯 题解

P1525 关押罪犯 题解

题解P1525 关押罪犯

洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

P1525 关押罪犯扩展域并查集

洛谷P1525关押罪犯——二分做法