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

来源:互联网 发布:行情分析软件 编辑:程序博客网 时间:2024/05/16 16:16

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;}
0 0
原创粉丝点击