【BZOJ1116】[POI2008]CLO 并查集

【BZOJ1116】[POI2008]CLO

Description

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

Input

第一行输入n m.1 <= n<= 100000,1 <= m <= 200000 下面M行用于描述M条边.

Output

TAK或者NIE 常做POI的同学,应该知道这两个单词的了...

Sample Input

4 5
1 2
2 3
1 3
3 4
1 4

Sample Output

TAK

上图给出了一种连接方式.

题解:题意——无向边不算入度!!

所以在一个连通块内,只要存在环,就一定能使这个连通块内的所有点都有一个入度,否则不能

如果一个连通块内边数≥点数,就说明一定存在环(也可以直接打个标记~)

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=100010;
int n,m;
int f[maxn],sv[maxn],se[maxn];
int find(int x)
{
	return (f[x]==x)?x:(f[x]=find(f[x]));
}
int main()
{
	scanf("%d%d",&n,&m);
	int i,j,a,b;
	for(i=1;i<=n;i++)	f[i]=i,sv[i]=1;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		if(find(a)!=find(b))
		{
			se[f[b]]+=se[f[a]],sv[f[b]]+=sv[f[a]],f[f[a]]=f[b];
		}
		se[f[b]]++;
	}
	for(i=1;i<=n;i++)
	{
		if(find(i)==i&&sv[i]>se[i])
		{
			printf("NIE");
			return 0;
		}
	}
	printf("TAK");
	return 0;
}

 

转载于:https://www.cnblogs.com/CQzhangyu/p/6825179.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值