BZOJ 1116 [POI2008]CLO(并查集)

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1116

【题目大意】

  Byteotia城市有n个towns,m条双向roads.每条road连接两个不同的towns,
  没有重复的road.你要把其中一些road变成单向边使得:每个town都有且只有一个入度

【题解】

  我们发现当一个连通块边数大于等于其点数的时候就满足条件,
  那么此题如果出现边数少于点数的连通块就不成立,
  用并查集能够完成判断。

【代码】

#include <cstdio>
#include <cstring>
using namespace std;
const int N=100010;
int f[N],n,m,mark[N];
int sf(int x){return f[x]==x?x:f[x]=sf(f[x]);}
int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++)f[i]=i,mark[i]=0;
        while(m--){
            int u,v;
            scanf("%d%d",&u,&v);
            if(sf(u)==sf(v)){
                f[sf(u)]=sf(v);
                mark[sf(v)]=1;
            }else{
                if(mark[sf(v)])f[sf(u)]=sf(v);
                else f[sf(v)]=sf(u);
            }
        }int flag=1;
        for(int i=1;i<=n;i++){
            if(sf(i)==i&&!mark[i]){flag=0;break;}
        }puts(flag?"TAK":"NIE");
    }return 0;
}
时间: 2024-10-26 06:28:56

BZOJ 1116 [POI2008]CLO(并查集)的相关文章

BZOJ 1116: [POI2008]CLO

1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 922  Solved: 514[Submit][Status][Discuss] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度 Input 第一行输入n m.1 <= n<= 100

BZOJ 1116: [POI2008]CLO [连通分量]

Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度 和上题一样... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std;

1116: [POI2008]CLO

1116: [POI2008]CLO https://lydsy.com/JudgeOnline/problem.php?id=1116 分析: 单独考虑每个联通块的情况. 设这个联通块里有n个点,那么至少有n-1条边了. 如果每个点入度都为1,那么就要求至少有n条边(其实就是基环树),大于n条边可以不选. 所以有:如果一个联通块是可行的,必须满足存在大于等于点数条边. 所以并查集维护加边的过程. 1.出现了环,那么这个联通块就合法了. 2.合并两个联通块,只要一个联通块里合法就行.(一个合法了

BZOJ 3674 可持久化并查集加强版(主席树变形)

3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2515  Solved: 1107 [Submit][Status][Discuss] Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^4 Input Output Sample Inp

BZOJ 1854: [Scoi2010]游戏 并查集

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2672  Solved: 958[Submit][Status][Discuss] Description lxhgww 最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使 用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极bos

BZOJ 2079 Poi2010 Guilds 并查集

题目大意:给定一个无向图,要求将一些点红黑染色,使每个点及其相连的点中至少有一个黑色的点和一个红色的点 逗比题ぽい~ 对于任意一个大小>=2的连通图,我们只需要搞出这个图的任意一棵生成树,将这棵生成树撸成二分图再染色就一定能满足要求的ぽい~ 因此无法满足要求当且仅当存在一个大小为1的联通块ぽい~ 并查集即可ぽい~ #include <cstdio> #include <cstring> #include <iostream> #include <algori

BZOJ 3319 黑白树 并查集+线段树

这这这这这这什么毒瘤题!!!!!!!!!!!!!!!!!!!!!!!!!!!! 卡LCT(优秀的LCT由于是均摊本身就带着2,3的常数在,而且这道题对于LCT标记十分难维护,又得乘上4,5然后就炸了),卡树剖,卡正解,但是暴力能A!!!!!!!!!!!!!!!!!!!!!! 所谓正解就是线段树为护dfs序+并查集删点去重,这东西在每个点一秒的时候都过不了Po姐都虚. 但是我在网上看到一个大佬有一个神思路A掉了 下面是我改过之后的的TLE程序 #include<cstdio> #include&

BZOJ 3673: 可持久化并查集 by zky

3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2084  Solved: 941[Submit][Status][Discuss] Description n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^4 Input Output Sample Input 5 6

BZOJ 3674: 可持久化并查集加强版

3674: 可持久化并查集加强版 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 2605  Solved: 977[Submit][Status][Discuss] Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状