uva 10596 欧拉回路

判断是否存在欧拉回路只要两个条件

图连通,不存在奇度点

注意特判边为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;
}

posted on 2015-09-16 21:47  此剑之势愈斩愈烈  阅读(118)  评论(0编辑  收藏  举报

导航