cf246 ENew Reform (并查集找环)

Berland has n cities connected by m bidirectional
roads. No road connects a city to itself, and each pair of cities is connected by no more than one road. It is not guaranteed that you can get from any city to any other one, using only the existing
roads.

The President of Berland decided to make changes to the road system and instructed the Ministry of Transport to make this reform. Now, each road should be unidirectional (only lead from one city to another).

In order not to cause great resentment among residents, the reform needs to be conducted so that there can be as few separate cities as possible. A city is considered separate, if no road leads
into it, while it is allowed to have roads leading from this city.

Help the Ministry of Transport to find the minimum possible number of separate cities after the reform.

Input

The first line of the input contains two positive integers, n and m —
the number of the cities and the number of roads in Berland (2?≤?n?≤?100?000, 1?≤?m?≤?100?000).

Next m lines contain the descriptions of the roads: the i-th
road is determined by two distinct integers xi,?yi(1?≤?xi,?yi?≤?nxi?≠?yi),
where xi and yi are
the numbers of the cities connected by the i-th road.

It is guaranteed that there is no more than one road between each pair of cities, but it is not guaranteed that from any city you can get to any other one, using only roads.

Output

Print a single integer — the minimum number of separated cities after the reform.

Examples

input

4 3
2 1
1 3
4 3

output

1

input

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

output

0

input

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

output

1

Note

In the first sample the following road orientation is allowed: .

The second sample: .

The third sample: .

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int fa[N];
bool flag[N];
int find(int x)
{
	int r=x;
	while(fa[r]!=r) r=fa[r];
	int i=x,j;
	while(i!=r) {
		j=fa[i];
		fa[i]=r;
		i=j;
	}
	return r;
}
int main()
{
	int n,m,i,j;
	int x,y,fx,fy;
	int ans;
	ans=0;
    scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) fa[i]=i;
	while(m--) {
		scanf("%d%d",&x,&y);
		fx=find(x);
		fy=find(y);
		if(fx!=fy) {
			fa[fx]=fy;
			if(flag[x]||flag[y]||flag[fx]||flag[fy])
			flag[fy]=flag[fx]=flag[x]=flag[y]=true;
		}
		else flag[fy]=flag[fx]=flag[x]=flag[y]=true;
	}
	for(i=1;i<=n;i++) {
		if(find(i)==i&&!flag[find(i)]) ans++;
	}
	printf("%d\n",ans);
	return 0;
}
时间: 2024-10-13 19:44:45

cf246 ENew Reform (并查集找环)的相关文章

杭电1272 并查集找环+判断连通

杭电1272 并查集找环+判断连通 E - E Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B

HDU - 4514 湫湫系列故事——设计风景线(并查集判环+树形DP)

题目链接:https://vjudge.net/problem/HDU-4514 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?  其中,可以兴建的路线均是双向的,他们之间的长度均大于0. Input 测试数据有

HDU2120【并查集判环】

Ice_cream's world I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 600    Accepted Submission(s): 344 Problem Description ice_cream's world is a rich country, it has many fertile lands. Today,

HDU - 4514 湫湫系列故事——设计风景线(并查集判环)

题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少? 其中,可以兴建的路线均是双向的,他们之间的长度均大于0. 思路: 将给出的边的两个端点用并查集放在一起,如果这两个点的祖先相等说明构成了一个环. 在这个用并查

HDU1856 - More is better 利用并查集找最大群体数目

HDU1856 - More is better: http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意: a和b认识,b和c认识,则a b c互相认识. 给出一些相互认识的两个人的编号. 判断最多有多少人互相认识(包括自己). 代码: #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN =

畅通工程(并查集找根节点)

畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 203 Accepted Submission(s): 168   Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间

HDU4514湫湫系列故事——设计风景线(并查集判环+最长直径)

题目链接:传送门 题意: 先判一个图是否存在换,不存在的话输出这个图的最长路径. 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> using namespace std; const int maxn = 1e6+10; int par[maxn/10],head[maxn/10]; bool

2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)

贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 10^5105 的字符串.现在魔法师想要通过一系列魔法使得这两个字符串相同.每种魔法形如 (u,\ v),\ u,\ v \le 10^5(u, v), u, v≤105,可以将一个字符 uu改成一个字符 vv,并且可以使用无限次.出于种种原因,魔法师会强行指定这两个串能否进行修改. 若失败输出 -

1151 - Buy or Build(二进制枚举子集 + 并查集)

这题LRJ书上翻译的有问题,书上说两点之间的cost是两点的欧几里得距离,而题目要求两点的距离是两点欧几里得距离的平方. 其余就没什么好说的了,裸的并查集,需要注意的就是二进制枚举子集的问题. 二进制枚举子集: for(int i = 0 ; i < (1 << s) ; i++){ /*s是集合元素的个数*/ for(int j = 0 ; j < s ; j++){ if(!(s >> j) & 1) continue; else{ } } } 140548