判断是否存在欧拉回路只要两个条件
图连通,不存在奇度点
注意特判边为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\n",i); if(i>n) flag=true; if(!flag||judge(n)||m<2) printf("Not Possible\n"); else printf("Possible\n"); } return 0;}
时间: 2024-12-16 04:11:17