题目链接:http://poj.org/problem?id=3310

思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径上的点进行标记,于是根据题意我们可以发现,如果这个图是“caterpillar”的话,那么他所有的边要么两端都在树上最长直径上,要么就是其中一端在,于是我们可以再次dfs进行判断就可以了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 111 struct Edge{
int v,next;
}edge[MAXN*MAXN]; int n,m,NE;
int head[MAXN]; void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
} int parent[MAXN]; void Initiate()
{
for(int i=;i<=n;i++){
parent[i]=i;
}
} int Find(int x)
{
if(x==parent[x]){
return parent[x];
}
parent[x]=Find(parent[x]);
return parent[x];
} bool Judge()
{
int cnt=;
for(int i=;i<=n;i++){
if(parent[Find(i)]==i)cnt++;
}
return cnt==;
} int dep[MAXN];
int path[MAXN];
bool mark[MAXN],vis[MAXN]; void dfs_dep(int u,int father)
{
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==father)continue;
dep[v]=dep[u]+;
path[v]=u;
dfs_dep(v,u);
}
} bool dfs(int u)
{
vis[u]=true;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(vis[v])continue;
if(mark[u]||mark[v]){
if(dfs(v))return true;
}
return false;
}
return true;
} int main()
{
// freopen("1.txt","r",stdin);
int u,v,st,ed,tmp,t=;
while(~scanf("%d",&n)&&n){
scanf("%d",&m);
NE=;
memset(head,-,sizeof(head));
Initiate();
bool flag=true;
while(m--){
scanf("%d %d",&u,&v);
Insert(u,v);
Insert(v,u);
if(Find(u)!=Find(v))parent[Find(u)]=Find(v);
else flag=false;
}
if(!flag||!Judge()){
printf("Graph %d is not a caterpillar.\n",t++);
continue;
}
dep[]=;
dfs_dep(,-);
ed=;
for(int i=;i<=n;i++){
if(dep[i]>dep[ed])ed=i;
}
dep[st=ed]=;
dfs_dep(st,-);
ed=;
for(int i=;i<=n;i++){
if(dep[i]>dep[ed])ed=i;
}
memset(mark,false,sizeof(mark));
path[st]=-;
mark[st]=true;
tmp=ed;
while(path[tmp]!=-){
mark[tmp]=true;
tmp=path[tmp];
}
memset(vis,false,sizeof(vis));
if(dfs()){
printf("Graph %d is a caterpillar.\n",t++);
}else
printf("Graph %d is not a caterpillar.\n",t++);
}
return ;
}

最新文章

  1. 基于mysql的数据管理
  2. Linux Shell 通配符、元字符、转义符【转帖】
  3. C#中是否可以继承String类
  4. Java入门的程序汇总
  5. 【转】Nginx系列(二)--模块化
  6. IP 转地址
  7. css引入讲解及media
  8. django 基础入门(二)
  9. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
  10. 监听器如何获取Spring配置文件(加载生成Spring容器)
  11. java学习笔记03-基本语法
  12. python基础09_字符串格式化
  13. Logging模块 + traceback模块 + importlib模块 + requests模块
  14. Sciter返回json
  15. Container(容器)
  16. P2871 手链
  17. 实训四(cocos2dx sharesdk集成-1)
  18. Material Designer的低版本兼容实现(八)—— Flat Button
  19. 05-matplotlib-直方图
  20. GridView练习题

热门文章

  1. SpringMVC响应Restful风格请求404
  2. 微信小程序navigateBack如何带参数
  3. C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗体
  4. php处理行业分类数据
  5. PHPExcel_Reader_Exception: is not recognised as an OLE file in Classes问题解决方法
  6. Archive将多个对象归档到同一个文件
  7. 点滴积累【other】---Windows 7 IIS (HTTP Error 500.21 - Internal Server Error)解决方案(转载)
  8. 如何通过 AAR 形式集成 leakcanary-android 服务
  9. python字符串操作,以及对应的C#实现
  10. Java内存分析工具jmap