图的遍历
图的遍历
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; }