CodeForces 659E New Reform
2016-06-07 18:14
281 查看
Description
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 ≤ n,
xi ≠ 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.
Sample Input
Input
Output
Input
Output
Input
Output
Hint
In the first sample the following road orientation is allowed:
,
,
.
The second sample:
,
,
,
,
.
The third sample:
,
,
,
,
.
题意:给定双向的路,要求改成单向,定义独立点:无入度的点,求独立点至少多少个
思路:最开始想到
poj1515Street Directions【无向图->有向图 链式前向星版tarjan求桥】
,然后越想越不对,这个题求的连通图虽然是用单向边连着的但是可以认为是只要求出连通的块数就可以了,又想到小希的迷宫(并查集),但是只能求出是否有环,不能求出环的个数,想到给每个团染色,记录个数,也不对。
其实正解很简单的,真的就是求出连通分量的个数就好了,枚举每个点把dfs的所有点都标记,在枚举的过程中,出现的没标记点的个数就是答案。其实这么说有问题的,有可能这点在主函数遍历到他的时候没染色,但是dfs的时候发现和之前的是连着的这样也会存在。
刚刚纠结于一个问题:既然之前都是连着的,为什么本来连着的点可能在之前遍历不到,dfs在遍历的时候是遇到环就退出的呀
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int>num[1000009];
int cnt;
bool vis[1000009];
bool flag;
void dfs(int u,int pre)
{
if(vis[u])
{
flag=1;
return;
}
vis[u]=1;
for(int i=0;i<num[u].size();i++)
{
int v=num[u][i];
if(v==pre)continue;
dfs(v,u);
}
}
int main()
{
// freopen("cin.txt","r",stdin);
int n,m;
while(~scanf("%d%d",&n,&m))
{
cnt=0;
for(int i=0;i<=n;i++)num[i].clear();
memset(vis,0,sizeof(vis));
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
num[x].push_back(y);
num[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
flag=0;
dfs(i,-1);
if(!flag)cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
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 ≤ n,
xi ≠ 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.
Sample Input
Input
4 3 2 1 1 3 4 3
Output
1
Input
5 5
2 11 3
2 3
2 5
4 3
Output
0
Input
6 5 1 2 2 3 4 5 4 6 5 6
Output
1
Hint
In the first sample the following road orientation is allowed:
,
,
.
The second sample:
,
,
,
,
.
The third sample:
,
,
,
,
.
题意:给定双向的路,要求改成单向,定义独立点:无入度的点,求独立点至少多少个
思路:最开始想到
poj1515Street Directions【无向图->有向图 链式前向星版tarjan求桥】
,然后越想越不对,这个题求的连通图虽然是用单向边连着的但是可以认为是只要求出连通的块数就可以了,又想到小希的迷宫(并查集),但是只能求出是否有环,不能求出环的个数,想到给每个团染色,记录个数,也不对。其实正解很简单的,真的就是求出连通分量的个数就好了,枚举每个点把dfs的所有点都标记,在枚举的过程中,出现的没标记点的个数就是答案。其实这么说有问题的,有可能这点在主函数遍历到他的时候没染色,但是dfs的时候发现和之前的是连着的这样也会存在。
刚刚纠结于一个问题:既然之前都是连着的,为什么本来连着的点可能在之前遍历不到,dfs在遍历的时候是遇到环就退出的呀
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int>num[1000009];
int cnt;
bool vis[1000009];
bool flag;
void dfs(int u,int pre)
{
if(vis[u])
{
flag=1;
return;
}
vis[u]=1;
for(int i=0;i<num[u].size();i++)
{
int v=num[u][i];
if(v==pre)continue;
dfs(v,u);
}
}
int main()
{
// freopen("cin.txt","r",stdin);
int n,m;
while(~scanf("%d%d",&n,&m))
{
cnt=0;
for(int i=0;i<=n;i++)num[i].clear();
memset(vis,0,sizeof(vis));
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
num[x].push_back(y);
num[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
flag=0;
dfs(i,-1);
if(!flag)cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
相关文章推荐
- java compareTo 和 binarySearch
- ServletContext作用功能详解
- Android 编程下 shape 绘制图形
- 构建高并发高可用的电商平台架构实践
- C++中的类与对象
- Go语言特点
- Technical Artist的不归路 —— 游戏场景的构图概念
- 数据库
- reactjs入门到实战(十)----one-first_app
- 如何把tomcat服务加到Windows系统服务
- 支持get post ccokie 获取
- sql server 2008完全卸载工具
- 剑指Offer----面试题29:数组中出现次数超过一半的数字
- 第15周-阅读程序(6)
- Java防止非法和重复表单提交的分析
- ImageLoder如何加载本地图片 sd卡图片 网络图片 assets文件夹下的图片 contentprovider图片
- [翻译]NDK之一:开始学习NDK编程
- Android Design Support Library(一):FloatingActionButton、TextInputLayout、TextInputEditText简单用法
- 伪静态
- 小记