poj 3310 Caterpillar 图的遍历

来源:互联网 发布:郑州php培训 编辑:程序博客网 时间:2024/05/15 06:38

题意:

给一个无向图,问是否可以在上面找到一条线,使所有的顶点要么在线上要么不在线上但在与线相连的边上。

思路:

先求各个顶点的度数,遍历度数大于1的点。

代码:

//poj 3310//sepNINE#include<iostream>using namespace std;const int maxN=128;int g[maxN][maxN];int d[maxN],ok[maxN],vis[maxN];int n;void dfs(int u){int v,cnt=0;ok[u]=1;vis[u]=1;for(v=1;v<=n;++v)if(g[u][v]==1&&d[v]>1){++cnt;if(cnt==3)return;}for(v=1;v<=n;++v)if(g[u][v]==1&&vis[v]==0){if(d[v]==1){ok[v]=1;continue;}elsedfs(v);}}int main(){int cases=0;while(scanf("%d",&n)==1&&n){int m;memset(g,0,sizeof(g));memset(d,0,sizeof(d));memset(ok,0,sizeof(ok));memset(vis,0,sizeof(vis));scanf("%d",&m);for(int i=0;i<m;++i){int a,b;scanf("%d%d",&a,&b);g[a][b]=g[b][a]=1;++d[a];++d[b];}if(m!=n-1){printf("Graph %d is not a caterpillar.\n",++cases);continue;}int i,flag=0;for(i=1;i<=n;++i)if(d[i]>1)break;dfs(i);for(i=1;i<=n;++i)if(ok[i]!=1)flag=1;if(flag==1)printf("Graph %d is not a caterpillar.\n",++cases);elseprintf("Graph %d is a caterpillar.\n",++cases);}} 


0 0
原创粉丝点击