您的位置:首页 > 其它

Codeforces Round #346 (Div. 2)E. New Reform 乱搞dfs

2016-04-01 12:18 302 查看
dfs分成个个区间,每个区间不存在环结果加1.

判断环,1 a,b两点间有两条以上的路。

2.a,b有一条路径,且b此时已走过且b不是搜索这条路时走到a的前一个点

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
map<int,int>mp[110000];
int next[200000],link[200000],n,m,co[200000],l,last[200000];
bool sym[200000],sym2;
void init()
{
l = 0;
memset(next,-1,sizeof(next));
memset(co,0,sizeof(co));
memset(sym,0,sizeof(sym));
}
void add(int a,int b)
{
link[l] = b;
last[l] = next[a];
next[a] = l;
l++;
}
void dfs(int Last,int pre)
{
co[pre] = 1;
for(int i=next[pre];i!=-1;i = last[i])
{
if(!co[link[i]])dfs(pre,link[i]);
else if(sym[link[i]]==true)sym2 = true;
else if(link[i]!=Last)sym2 = true;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int sum = 0;
init();
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
mp[a][b]++;
mp[b][a]++;
if(mp[a][b]>=2)
{
sym[a] = true;
sym[b] = true;
}
}
for(int i=1;i<=n;i++)
if(!co[i])
{
sym2 = false;
dfs(i,i);
if(!sym2)sum++;
}
printf("%d\n",sum);
for(int i=1;i<=n;i++)
mp[i].clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: