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

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

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 #define MAXN 111
  7
  8 struct Edge{
  9     int v,next;
 10 }edge[MAXN*MAXN];
 11
 12 int n,m,NE;
 13 int head[MAXN];
 14
 15 void Insert(int u,int v)
 16 {
 17     edge[NE].v=v;
 18     edge[NE].next=head[u];
 19     head[u]=NE++;
 20 }
 21
 22 int parent[MAXN];
 23
 24 void Initiate()
 25 {
 26     for(int i=1;i<=n;i++){
 27         parent[i]=i;
 28     }
 29 }
 30
 31 int Find(int x)
 32 {
 33     if(x==parent[x]){
 34         return parent[x];
 35     }
 36     parent[x]=Find(parent[x]);
 37     return parent[x];
 38 }
 39
 40 bool Judge()
 41 {
 42     int cnt=0;
 43     for(int i=1;i<=n;i++){
 44         if(parent[Find(i)]==i)cnt++;
 45     }
 46     return cnt==1;
 47 }
 48
 49 int dep[MAXN];
 50 int path[MAXN];
 51 bool mark[MAXN],vis[MAXN];
 52
 53 void dfs_dep(int u,int father)
 54 {
 55     for(int i=head[u];i!=-1;i=edge[i].next){
 56         int v=edge[i].v;
 57         if(v==father)continue;
 58         dep[v]=dep[u]+1;
 59         path[v]=u;
 60         dfs_dep(v,u);
 61     }
 62 }
 63
 64 bool dfs(int u)
 65 {
 66     vis[u]=true;
 67     for(int i=head[u];i!=-1;i=edge[i].next){
 68         int v=edge[i].v;
 69         if(vis[v])continue;
 70         if(mark[u]||mark[v]){
 71             if(dfs(v))return true;
 72         }
 73         return false;
 74     }
 75     return true;
 76 }
 77
 78
 79 int main()
 80 {
 81  //   freopen("1.txt","r",stdin);
 82     int u,v,st,ed,tmp,t=1;
 83     while(~scanf("%d",&n)&&n){
 84         scanf("%d",&m);
 85         NE=0;
 86         memset(head,-1,sizeof(head));
 87         Initiate();
 88         bool flag=true;
 89         while(m--){
 90             scanf("%d %d",&u,&v);
 91             Insert(u,v);
 92             Insert(v,u);
 93             if(Find(u)!=Find(v))parent[Find(u)]=Find(v);
 94             else flag=false;
 95         }
 96         if(!flag||!Judge()){
 97             printf("Graph %d is not a caterpillar.\n",t++);
 98             continue;
 99         }
100         dep[1]=0;
101         dfs_dep(1,-1);
102         ed=1;
103         for(int i=1;i<=n;i++){
104             if(dep[i]>dep[ed])ed=i;
105         }
106         dep[st=ed]=0;
107         dfs_dep(st,-1);
108         ed=1;
109         for(int i=1;i<=n;i++){
110             if(dep[i]>dep[ed])ed=i;
111         }
112         memset(mark,false,sizeof(mark));
113         path[st]=-1;
114         mark[st]=true;
115         tmp=ed;
116         while(path[tmp]!=-1){
117             mark[tmp]=true;
118             tmp=path[tmp];
119         }
120         memset(vis,false,sizeof(vis));
121         if(dfs(1)){
122             printf("Graph %d is a caterpillar.\n",t++);
123         }else
124             printf("Graph %d is not a caterpillar.\n",t++);
125     }
126     return 0;
127 }

View Code

poj 3310(并查集判环,图的连通性,树上最长直径路径标记)相关推荐

  1. Ice_cream's world I HDU - 2120(并查集判环)

    题意:问给出的望塔之间的建造了围墙,将土地分成了几份 思路:用并查集判环,若有围墙相接的瞭望塔,有相同的父根,则存在环 ice_cream's world is a rich country, it ...

  2. LA3644简单并查集判环

    题意:       有n个化合物,每个化合物是两种元素组成,现在要装车,但是一旦车上的化合物中的某几个化合物组成这样一组关系,有n个化合物正好用了n中元素,那么就会爆炸,输入的顺序是装车的顺序,对于每 ...

  3. 【HDU - 1272】小希的迷宫 (并查集判环)

    题干: 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通 ...

  4. Codeforces 103B - Cthulhu(并查集 找环和块)

    传送门:https://codeforces.com/problemset/problem/103/B 题意: 给一个n个结点,m条边的无向图 判断给定图是否满足以下条件: 能被表示为有3个及以上的有 ...

  5. 并查集 ---- 扩展域并查集判二分图 + 循环模拟字典树 The 2020 ICPC Asia Macau Regional Contest C. Club Assignment (详解)

    题目链接 题目大意: 有n个数,现在要把他们拆分成两个集合,假设S为集合,有如下定义: f(S)={min(x⊕y)∣x,y∈S,andx!=y}f(S)=\{min(x\oplus y)|x,y\i ...

  6. HDU 1272 - 小希的迷宫(并查集判树)

    目录 Problem Description C++代码 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来 ...

  7. 【反向并查集、联通图】P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  8. [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...

  9. 巧用并查集求解环的个数以及连通块的数目

    2021年度训练联盟热身训练赛第二场--F题:Interstellar Love 题意 给你s个点,c个连接数,求解这s个点组成的连通块的数量以及其中所包含的环的数量(孤立的点不算作连通块和环). 思 ...

最新文章

  1. spring AOP注解含义
  2. android手机拍摄权限,react-native 手机拍照权限
  3. MySQL存储引擎中MyISAM和InnoDB区别
  4. echarts自学笔记
  5. linux pipe 文件,Linux系统常用指令、管道(pipe)、文件查找(find)
  6. jquery.js把我的时间修改了为什么?_电气老手在PLC程序调试修改时的几个必备小窍门,看你知道几个?...
  7. 单元格排序_Excel中这8种简单实用的排序方法,很多人都还不会用!
  8. 垂直旋转转台电机选型_高精密YRT转台轴承概览
  9. EJB-02:EJB开发流程
  10. 网络编程 : 基于UDP的网络群聊聊天室
  11. F28335的SCI模块
  12. iOS绘制1像素的线
  13. setpositivebutton
  14. ANDROID内存优化(大汇总——全)
  15. 计算机组装维护教学工作总结,计算机组装与维护教师工作总结_2
  16. 第三届世界5G大会召开之前,我们来复习一下这本6G白皮书
  17. 决策树与K-近邻分类随堂笔记(二)
  18. wps一直显示正在备份怎么办_wps怎么设置和取消自动备份功能
  19. 简历上的哪些内容才是 HR 眼中的干货?
  20. 机器学习实战:基于Scikit-Learn.Keras和TensorFlow(原书第2版) 奥雷利安·杰龙——环境搭建anaconda

热门文章

  1. 部分 DNS 查询因闰秒 bug 报错
  2. koa源码分析-generator和yield分析
  3. 《认清C++语言》之--内存管理
  4. DHCP的安装到简单测试(tar方式)
  5. Java之intern方法
  6. 什么时候对象可以被收回?
  7. kube-scheduler 源码解析
  8. 算法题存档20190204
  9. mysql被除数为0不报错_MySQL:关系除法
  10. Vue 页面加载闪现出现{{xxx}}问题