思路:
使用无向图找欧拉图模板判断联通性,再由欧拉图的性质,即可判断
欧拉图性质:
无向图:联通+所有点的度数为偶数
无向图:联通+所有点的入度数=出度数
代码:
#include <iostream>
#include <string.h>
using namespace std;
const int MAX_N=100000;
struct edge
{
int to,next;
}e[2*MAX_N];
int eid,p[MAX_N];
int ans[MAX_N];
int ansi=0;
bool vst[2*MAX_N];
int degree[MAX_N];
void init()
{
eid=0;
memset(p,-1,sizeof(p));
memset(vst,false,sizeof(vst));
memset(degree,0,sizeof(degree));
}
void insert(int u,int v)
{
e[eid].to=v;
e[eid].next=p[u];
p[u]=eid++;
}
void dfs(int now)
{
int k;
for(k=p[now];k!=-1;k=e[k].next)
{
if(!vst[k])
{
vst[k]=true;
vst[k^1]=true;
dfs(e[k].to);
ans[ansi++]=k;
}
}
}
int main()
{
int n,m;
init();
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
insert(a,b);
insert(b,a);
degree[a]++;
degree[b]++;
}
int flag=1;
for(int i=1;i<=n;i++)
{
if(degree[i]%2)
{
flag=0;
break;
}
}
dfs(1);
for(int i=1;i<=n;i++)
{
if(!vst[i])
{
flag=0;
break;
}
}
if(flag)
cout<<1<<endl;
else
cout<<0<<endl;
}