#include <iostream>
#include <vector>
using namespace std;
/****************************************************************************************************************
题意:
给你一个图,现在要你给这个图里面的边定方向,使得入度为0的点最少。
思路:
1, 对于一个连通块而言,如果里面存在一个环,那么必然所有点的入度都可以大于等于1
否则的话,就存在一个点的入度为0。
2,(判断连通块是否存在环)
假设当前的节点一个标号id,如果下一个要访问的节点未被访问过,
那么下一个访问的节点的标号是当前的id 1,
这里,我们先看看如果图没有环,那么会有一条路径从id开始一直往前,直到叶子节点,
最后一个叶子节点的标号可能是id x,那么假设的确有一个节点的标号为id x,
而且这个节点和id直接也相连,是否说明有环存在。除非x=1,因为如果x=1,
说明,实际上这个节点是和id节点直接连接的边。
3, 最后 dfs 一波就好了
****************************************************************************************************************/
const int maxn = 1e5+7;
vector <int> E[maxn];
int n,m,flag;
int vis[maxn];
void dfs(int x,int fa)
{
if(vis[x]){
flag = 1;
return;
}
vis[x]=1;
for(int i=0;i<E[x].size();i++){
int v=E[x][i];
if(v==fa)continue;
dfs(v,x);
}
}
int main()
{
while(cin>>n>>m)
{
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
E[x].push_back(y);
E[y].push_back(x);
}
int ans = 0;
for(int i=1;i<=n;i++){
if(!vis[i]){
flag = 0;
dfs(i,-1);
if(!flag)ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
转载于:https://www.cnblogs.com/Jstyle-continue/p/6352024.html