#include<iostream>
#include<fstream>
using namespace std;
int n,m;
struct e{
int data;
e *next;
};
e edge[101];
void add(int s,int t){
e *p=new e;
p->data=t;
p->next=edge[s].next;
edge[s].next=p;
e *q=new e;
q->data=s;
q->next=edge[t].next;
edge[t].next=q;
}
int in[101];
int v[101];
int dfs(int s,int f){
int i;
v[s]=1;
e *p=edge[s].next;
while(p)
{
if(p->data==f)
{
p=p->next;
continue;
}
if(v[p->data]==1)
return 1;
i=dfs(p->data,s);
if(i) return 1;
p=p->next;
}
return 0;
}
int a[101];
int solve(){
int i,j,k;
memset(v,0,sizeof(v));
if(dfs(1,0)) return 0;
for(i=1;i<=n;i++)
if(v[i]==0) return 0;
for(i=1;i<=n;i++)
a[i]=in[i];
for(i=1;i<=n;i++)
{
e *p=edge[i].next;
while(p)
{
if(in[p->data]==1)
{
a[p->data]=0;
a[i]--;
}
p=p->next;
}
}
j=0;
for(i=1;i<=n;i++)
if(a[i]==1) j++;
if(j>2) return 0;
return 1;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int cas=0;
while(cin>>n)
{
cas++;
if(n==0) return;
for(i=1;i<=n;i++)
edge[i].next=0;
memset(in,0,sizeof(in));
cin>>m;
for(i=1;i<=m;i++)
{
cin>>j>>k;
add(j,k);
in[j]++;
in[k]++;
}
if(solve())
printf("Graph %d is a caterpillar.\n",cas);
else
printf("Graph %d is not a caterpillar.\n",cas);
}
}
int main(){
read();
return 0;
}
转载于:https://www.cnblogs.com/zhaozhe/archive/2011/05/29/2061880.html