判断是否存在欧拉回路只要两个条件
图连通,不存在奇度点
注意特判边为0的情况。另外这题数据坑。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=208;
struct fuck{
int u,v,next;
}edge[maxn*maxn];
int head[maxn];
int tol;
void init()
{
tol=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v)
{
edge[tol].u=u;
edge[tol].v=v;
edge[tol].next=head[u];
head[u]=tol++;
}
bool vis[maxn];
int du[maxn];
void dfs(int u)
{
int i,v;
vis[u]=true;
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(!vis[v]) dfs(v);
}
}
bool judge(int n)
{
for(int i=1;i<=n;i++)
if(du[i]%2) return true;
return false;
}
int main()
{
int i,j,n,m,u,v;
while(scanf("%d%d",&n,&m)==2)
{
init();
memset(du,0,sizeof(du));
u=0;
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
u++;v++;
du[u]++;du[v]++;
addedge(u,v);
addedge(v,u);
}
memset(vis,false,sizeof(vis));
dfs(u);
bool flag=false;
for(i=1;i<=n;i++)
if(!vis[i]&&du[i]>0)
break;
// printf("%d ",i);
if(i>n) flag=true;
if(!flag||judge(n)||m<2) printf("Not Possible ");
else printf("Possible ");
}
return 0;
}