题目链接:https://www.jisuanke.com/course/615/28228
题目思路:利用并查集判断是否为连通图,然后再利用欧拉图的相关的性质进行判断。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int pre[maxn];
int n,m;
struct node
{
int in;
int out;
}p[maxn];
void build()
{
for(int i=0;i<=n;i++) pre[i]=i,p[i].in=0,p[i].out=0;
}
int Find(int x)
{
int p=x,tmp;
while(x!=pre[x]) x=pre[x];
while(p!=x){
tmp=pre[p];
pre[p]=x;
p=tmp;
}
return x;
}
bool join(int x,int y)
{
int p=Find(x);
int q=Find(y);
if(p!=q){
pre[p]=q;
return false;
}
return true;
}
int main()
{
cin>>n>>m;
int x,y,sumn=n;
build();
for(int i=1;i<=m;i++){
cin>>x>>y;
if(!join(x,y)) sumn--;
p[x].out++;
p[y].in++;
}
int flag=0;
int s=2;
if(sumn==1)
for(int i=1;i<=n;i++)
if(p[i].out!=p[i].in){
s--;
if(p[i].out-p[i].in==-1) flag++;
if(p[i].in-p[i].out==-1) flag--;
}
//cout<<sumn<<" "<<flag<<" "<<s<<endl;
if(sumn==1&&flag==0&&(s==0||s==2)) cout<<"1"<<endl;
else cout<<"0"<<endl;
return 0;
}