图的遍历

图的遍历

https://ac.nowcoder.com/acm/problem/52275

每次走2步,然后要求每个点都要去遍历到,那么转换一下思想就是判断奇数环,比如1-2-3-1;那么就是可以全部遍历到每个点,首先是1然后是3然后是2,那么我们是不是就是去找这个图的联通分量,然后去判断是否有奇环,如果有一个奇环,那么就是所有的联通分量-1,如果没有答案那就是所有的联通分量,手动枚举一下就可以得出结论了

#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define debug(x) cout << #x << ": " << x << endl;
#define debug1(x) cout<<"xxx"<<endl;
#define ll long long
#define ull unsigned long long
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#define mse(a,b) memset(a,b,sizeof a);
#define fro for
#define it int
using namespace std;
const int maxx=1e6+100;
const int mod=1e9+7;
const int mod1=998244353;
int head[maxx];
int cnt=0;
int vis[maxx];
struct node
{
    int next,from,to;
};
node ans[maxx];
void add(int a,int b)
{
    ans[++cnt].from=a;
    ans[cnt].to=b;
    ans[cnt].next=head[a];
    head[a]=cnt;
}
int biaoji=0;
void dfs(int x,int fa)
{
     for(int i=head[x];~i;i=ans[i].next)
     {
         int v=ans[i].to;
         if(v==fa)
            continue;
         if(vis[v])
         {
             if(vis[v]==vis[x]) biaoji=1;//判断是否为奇数环,
             continue;
         }
         vis[v]=-vis[x];//相邻的点标记为不同,
         dfs(v,x);
     }
}
int main()
{

   int n,m;
   int sum=0;
   cin>>n>>m;
   mse(head,-1);
   for(int i=1;i<=m;i++)
   {
       int a,b;
       cin>>a>>b;
       add(a,b);
       add(b,a);
   }
   for(int i=1;i<=n;i++)
   {
       if(!vis[i])
       {
           vis[i]=1;
           sum++;
           dfs(i,0);
       }
   }
   if(biaoji) cout<<sum-1<<endl;
   else
    cout<<sum<<endl;
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务