poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接: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 ;
}
poj 3310(并查集判环,图的连通性,树上最长直径路径标记)的更多相关文章
- 2019 蓝桥杯国赛 B 组模拟赛 E 蒜头图 (并查集判环)
思路: 我们看条件,发现满足条件的子图无非就是一些环构成的图, 因为只有形成环,才满足边的两个点都在子图中,并且子图中节点的度是大于0的偶数. 那么如果当前有k个环,我们可以选2^k-1个子图,为什么 ...
- A simple problem(并查集判环)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497 题意:给定一些点和边的关系,判断S点是否 ...
- HDU 4514并查集判环+最长路
点击打开链接 题意:中文题...... 思路:先推断是否能成环,之前以为是有向图,就用了spfa推断,果断过不了自己出的例子,发现是无向图.并查集把,两个点有公共的父节点,那就是成环了,之后便是求最长 ...
- HDU - 4514 湫湫系列故事——设计风景线(并查集判环)
题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n ...
- LA3644简单并查集判环
题意: 有n个化合物,每个化合物是两种元素组成,现在要装车,但是一旦车上的化合物中的某几个化合物组成这样一组关系,有n个化合物正好用了n中元素,那么就会爆炸,输入的顺序是装车的顺序,对于每 ...
- 【HDOJ 1272】小希的迷宫(并查集+无环图)
描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...
- BZOJ1050 [HAOI2006]旅行comf[并查集判图连通性]
★ Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径 ...
随机推荐
- spring cloud jackson 枚举json互转 枚举json序列化/反序列化
先定义一个枚举基类 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = ...
- mysql union和union all 的差别以及使用
Union由于要进行反复值扫描,所以效率低.假设合并没有刻意要删除反复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样.并且字段类型要"相容"(一致). ...
- 前端纯css 图片的模糊处理
最近做的一个项目需要用到背景图的模糊处理,在网上查资料,发现用css的 filter 属性就可以解决,但是因为模糊度比较高,四周会有很长的模糊边,百度上也没找到解决的方法,,可喜的是最后我在分析一个d ...
- asp.net生成视图时报错 未引用System.Runtime, Version...
这是没有添加程序集引用 在程序集中添加一条引用 <compilation debug="true" targetFramework="4.5.1"> ...
- android 关于setWidth()和setHeight()没反应的问题
在android开发过程中,对于控件的高度,宽度,虽然在xml中用android:layout_height="match_parent"设置了 高度(match_parent ...
- Web檢測
腾讯电脑管家http://guanjia.qq.com/online_server/webindex.html 安全联盟http://zhanzhang.anquan.org/physical/my_ ...
- Java并发编程(三):并发模拟(工具和Java代码介绍)
并发模拟工具介绍 ① Postman : Http请求模拟工具 从图上我们可以看出,Postman模拟并发其实是分两步进行操作的.第一步:左边的窗口,在窗口中设置相关接口以及参数,点击运行进行第二步. ...
- 关于Tomcat 开启不了的几点解释
这段时间基本熟悉java语言基本语法包,类(内部,外部),整体结构跟c#还是有点差异,在接口,多态,抽象等几乎一致,唯一差异仅存在于关键字上. 在用了几天记事本熟悉代码上,昨天晚上就准备转想myEcl ...
- Centos下运行定时任务Crontab命令介绍
1.Cron的启动与关闭 因为Cron是Linux的内置服务.能够用下面的方法启动.关闭这个服务: /sbin/service crond start //启动服务 /sbin/s ...
- Oracle VM VirtualBox虚拟机导出教程
Oracle VM VirtualBox虚拟机导出教程 | 浏览:583 | 更新:2015-01-31 11:21 1 2 3 4 5 6 7 分步阅读 有时我们需要把Oracle VM Virtu ...