#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int deg[230];//每个点的度,根据欧拉定理连通图的每个点度都为偶数时,可以遍历每个桥一次
int n,m;
int a,b;//连接的两个点
bool d;
bool un_link;//d代表是否有度为奇数的点,un_link代表是否连通
int sets[230];//点集合,初始化时每个点是一个集合,如果有边连接两个点,就把这两个点所在的集合合并,方法见代码
int find(int i)//寻找点i所在的集合(集合的代表点也就是第一个放进去的点,也即返回值)
{
if(i != sets[i])
return find(sets[i]);
else return sets[i];
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0) //不存在路,直接输出,不然会RE,编译器不一样的话就不会RE
{
printf("Not Possible\n");
continue;
}
memset(deg,0,sizeof(deg));
d=0,un_link=0;
for(int i=0; i<n; i++)
sets[i]=i;
for(int i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
sets[find(a)]=find(b);//把a点所在的集合放入了b所在的集合
deg[a]++;
deg[b]++;
}
int i;
for(i=0; !deg[i]; i++);//找到第一个有连接的点
for(int j=i+1; j<n; j++) //判断是否连通
if(deg[j] && find(j)!=find(i))
{
un_link=1;//如果写成==1,不会报错!!!
break;
}
for(int j=0; j<n; j++)
if(deg[j]%2 != 0)
{
d=1;
break;
}
if(d || un_link)
printf("Not Possible\n");
else
printf("Possible\n");
}
return 0;
}
uva10596
最新推荐文章于 2019-03-10 23:30:14 发布