poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接: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(并查集判环,图的连通性,树上最长直径路径标记)相关推荐
- Ice_cream's world I HDU - 2120(并查集判环)
题意:问给出的望塔之间的建造了围墙,将土地分成了几份 思路:用并查集判环,若有围墙相接的瞭望塔,有相同的父根,则存在环 ice_cream's world is a rich country, it ...
- LA3644简单并查集判环
题意: 有n个化合物,每个化合物是两种元素组成,现在要装车,但是一旦车上的化合物中的某几个化合物组成这样一组关系,有n个化合物正好用了n中元素,那么就会爆炸,输入的顺序是装车的顺序,对于每 ...
- 【HDU - 1272】小希的迷宫 (并查集判环)
题干: 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通 ...
- Codeforces 103B - Cthulhu(并查集 找环和块)
传送门:https://codeforces.com/problemset/problem/103/B 题意: 给一个n个结点,m条边的无向图 判断给定图是否满足以下条件: 能被表示为有3个及以上的有 ...
- 并查集 ---- 扩展域并查集判二分图 + 循环模拟字典树 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 ...
- HDU 1272 - 小希的迷宫(并查集判树)
目录 Problem Description C++代码 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来 ...
- 【反向并查集、联通图】P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...
- 巧用并查集求解环的个数以及连通块的数目
2021年度训练联盟热身训练赛第二场--F题:Interstellar Love 题意 给你s个点,c个连接数,求解这s个点组成的连通块的数量以及其中所包含的环的数量(孤立的点不算作连通块和环). 思 ...
最新文章
- spring AOP注解含义
- android手机拍摄权限,react-native 手机拍照权限
- MySQL存储引擎中MyISAM和InnoDB区别
- echarts自学笔记
- linux pipe 文件,Linux系统常用指令、管道(pipe)、文件查找(find)
- jquery.js把我的时间修改了为什么?_电气老手在PLC程序调试修改时的几个必备小窍门,看你知道几个?...
- 单元格排序_Excel中这8种简单实用的排序方法,很多人都还不会用!
- 垂直旋转转台电机选型_高精密YRT转台轴承概览
- EJB-02:EJB开发流程
- 网络编程 : 基于UDP的网络群聊聊天室
- F28335的SCI模块
- iOS绘制1像素的线
- setpositivebutton
- ANDROID内存优化(大汇总——全)
- 计算机组装维护教学工作总结,计算机组装与维护教师工作总结_2
- 第三届世界5G大会召开之前,我们来复习一下这本6G白皮书
- 决策树与K-近邻分类随堂笔记(二)
- wps一直显示正在备份怎么办_wps怎么设置和取消自动备份功能
- 简历上的哪些内容才是 HR 眼中的干货?
- 机器学习实战:基于Scikit-Learn.Keras和TensorFlow(原书第2版) 奥雷利安·杰龙——环境搭建anaconda