图的遍历
图的遍历
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;
}
科大讯飞公司氛围 423人发布