uva10596

来源:互联网 发布:fifaol3数据库手机版 编辑:程序博客网 时间:2024/06/05 20:01
#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;}
原创粉丝点击