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,求 一条路径,使得路径 ...
随机推荐
- 理解和使用 Promise.all 和 Promise.race
一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Promise实例.同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回 ...
- Yahoo关于性能优化的N条军规
一. Yahoo的军规条例: 谨记:80%-90%的终端响应时间是花费在下载页面中的图片,样式表,脚本,flash等:详细的解释来这里查:http://developer.yahoo.com/perf ...
- 2、jQuery选择器
2.1 基本选择器 它有元素Id.Class.元素名.多个选择符组成,通过基本选择器可以实现大多数页面元素的查找. 选择器 功能 返回值 #id 根据给定的ID匹配一个元素 单个元素 element ...
- ios8 横屏
iOS8横屏时,状态栏会消失 使用以下代码可以阻止状态栏消失 override func prefersStatusBarHidden() -> Bool { return false }
- HTML-HTML5+CSS3权威指南阅读(四、媒体查询)
1.媒体类型 HTML 4和CSS 2目前支持为不同的媒体类型设定专有的样式表, 比如, 一个页面在屏幕上显示时使用无衬线字体, 而在打印时则使用衬线字体, screen 和 print 是两种已定义 ...
- 修改select下拉框的下拉按钮
ie上的下拉框下拉按钮真是太丑了,如何把他自定义一下呢? 首先,把浏览器自带的下拉框去掉: select::-ms-expand { display: none; } 接下来,用自己喜欢的下拉图片去 ...
- ANSI实现动态 sql
/* 包含C头文件 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* 包含SQLCA ...
- poj_2773
题目的愿意非常easy.给你一个n,求在升序排列的情况下,第k个与之相互素的数. 解法:首先我们要知道gcd(b×t+a,b)=gcd(a.b),那么接下来就非常easy了.全部与之互素的数都是以ph ...
- 【LeetCode-面试算法经典-Java实现】【075-Sort Colors (颜色排序)】
[075-Sort Colors (颜色排序)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an array with n objects colore ...
- 查询MySql数据库架构信息:数据库,表,表字段
/*1.查询所有数据库*/ show databases; /*2.查询所有数据表*/ select * from information_schema.tables where table_sch ...