NOIP2010 提高组 复赛 prison 关押罪犯
2017-06-20 22:31
411 查看
NOIP2010 提高组 复赛 prison 关押罪犯
//P1525 关押罪犯
//代码角度来说,这篇文章写得比较漂亮http://hzwer.com/599.html
//该题用并查集的核心是,敌人的敌人是朋友。
//e[i].a+n表示e[i].a的对立面,属不同的两个集合,而该问题中一共两个集合。
//f[e[i].a+n] 与 f[e[i].a]爸爸不同。
//看懂他人代码比较关键的一条是:带入输入数据进行手动模拟。该题收获之一。
//该题收获之二,集合合并原来可以写得这么简洁。
#include <stdio.h>
#include <string.h>
int f[20000*2+100];
struct node{
int a,b,c;
}e[100000+100],e_t;
void quicksort(int left,int right){//快排,从大到小
int i=left,j=right,mid=e[(left+right)/2].c;
while(i<=j){
while(e[i].c>mid)
i++;
while(e[j].c<mid)
j--;
if(i<=j){
e_t=e[i];
e[i]=e[j];
e[j]=e_t;
i++;
j--;
}
}
if(left<j)
quicksort(left,j);
if(i<right)
quicksort(i,right);
}
int getf(int u){//找爸爸
if(f[u]==u)
return f[u];
f[u]=getf(f[u]);
return f[u];
}
int main(){
int n,m,i,j,f1,f2;
scanf("%d%d",&n,&m);
for(i=1;i<=2*n;i++)
f[i]=i;
for(i=1;i<=m;i++)
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
quicksort(1,m);
for(i=1;i<=m;i++){
f1=getf(e[i].a);
f2=getf(e[i].b);
if(f1==f2){
printf("%d\n",e[i].c);
return 0;
}
f[f2]=getf(e[i].a+n);//合并集合 ,敌人的敌人是朋友
f[f1]=getf(e[i].b+n);
}
printf("0\n");
return 0;
}
//P1525 关押罪犯
//代码角度来说,这篇文章写得比较漂亮http://hzwer.com/599.html
//该题用并查集的核心是,敌人的敌人是朋友。
//e[i].a+n表示e[i].a的对立面,属不同的两个集合,而该问题中一共两个集合。
//f[e[i].a+n] 与 f[e[i].a]爸爸不同。
//看懂他人代码比较关键的一条是:带入输入数据进行手动模拟。该题收获之一。
//该题收获之二,集合合并原来可以写得这么简洁。
#include <stdio.h>
#include <string.h>
int f[20000*2+100];
struct node{
int a,b,c;
}e[100000+100],e_t;
void quicksort(int left,int right){//快排,从大到小
int i=left,j=right,mid=e[(left+right)/2].c;
while(i<=j){
while(e[i].c>mid)
i++;
while(e[j].c<mid)
j--;
if(i<=j){
e_t=e[i];
e[i]=e[j];
e[j]=e_t;
i++;
j--;
}
}
if(left<j)
quicksort(left,j);
if(i<right)
quicksort(i,right);
}
int getf(int u){//找爸爸
if(f[u]==u)
return f[u];
f[u]=getf(f[u]);
return f[u];
}
int main(){
int n,m,i,j,f1,f2;
scanf("%d%d",&n,&m);
for(i=1;i<=2*n;i++)
f[i]=i;
for(i=1;i<=m;i++)
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
quicksort(1,m);
for(i=1;i<=m;i++){
f1=getf(e[i].a);
f2=getf(e[i].b);
if(f1==f2){
printf("%d\n",e[i].c);
return 0;
}
f[f2]=getf(e[i].a+n);//合并集合 ,敌人的敌人是朋友
f[f1]=getf(e[i].b+n);
}
printf("0\n");
return 0;
}
相关文章推荐
- NOIP2010提高组复赛 解题报告(C/C++)(机械翻译)(乌龟棋)(关押罪犯)(引水入城)
- 关押罪犯 (NOIP2010)复赛 提高组 试题三 解题代码
- 【图-二分图染色】NOIP2010提高组关押罪犯
- NOIP2010提高组 关押罪犯
- 【二分+染色】【NOIP2010】关押罪犯 prison
- NOIP2010提高组 关押罪犯
- [codevs 1069 关押罪犯] [NOIP2010提高T3]
- NOIP2010提高组 关押罪犯 -SilverN
- [NOIp2010提高组]关押罪犯
- 题解【luoguP1525 NOIp提高组2010 关押罪犯】
- NOIP2010提高组 关押罪犯(并查集)
- 【NOIP2010提高组】关押罪犯
- 【NOIP2010提高组】关押罪犯
- 【NOIP2010提高组】关押罪犯
- 【NOIP 2010 提高组 T3】关押罪犯(并查集)
- NOIP 2010 - 提高组 关押罪犯 二分答案+二分图的判定
- 【NOIP2010】关押罪犯prison
- noip提高组 2010 关押罪犯 (洛谷1525)
- [NOIP2010] 提高组 洛谷P1525 关押罪犯
- TYVJ1403(NOIP2010提高组T3)关押罪犯