看是否连通,是否是欧拉回路。注意r=0是输出Not Possible,虽然我认为r=0是应该输出Possible
#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std ;
struct load
{
int x,y;
};
int flag,n,r;
load lo[11000];
int f[210];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
void liangtong()
{
int i;
for(i=0; i<n; ++i)
f[i]=i;
for(i=0; i<r; ++i)
{
int e=find(f[lo[i].x ]);
int v=find(f[lo[i].y ]);
if(e!=v)
{
f[e]=v;
}
}
int ans=find(lo[0].x);
for(i=1; i<r; ++i)
{
if(ans!=find(lo[i].x ))
{
flag=0;
return;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
// int n,r;
while(~scanf("%d%d",&n,&r))
{
int i;
flag=1;
int shu[210]= {0};
//int in[210]={0};
for(i=0; i<r; ++i)
{
scanf("%d%d",&lo[i].x,&lo[i].y);
++shu [lo[i].x];
++shu[lo[i].y];
}
if(r==0)
{
printf("Not Possible\n");continue;
}
for(i=0; i<n; ++i)
{
if(shu[i]%2==1)
{
flag=0;
break;
}
}
if(!flag)
{
printf("Not Possible\n");
continue;
}
liangtong();
if(!flag)
{
printf("Not Possible\n");
}
else printf("Possible\n");
}
return 0 ;
}