HDU 4612 Warm up(手动扩栈,求树上哪两个点的距离最远)
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <cstring>
usingnamespace std;
#define INF 0xfffffff
#define maxn 200005
#define min(a,b) (a<b?a:b)
int m, n, Time, top, cnt;
int blocks[maxn], dfn[maxn], low[maxn], Stacks[maxn], Father[maxn];
int step[maxn];
vector<vector<int> > G;
vector<vector<int> > G2;
void init()
{
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(blocks, , sizeof(blocks));
Time = top = cnt = ;
G.clear();
G.resize(n+); G2.clear();
G2.resize(n+);
}
void Tarjan(int u,int fa)
{
dfn[u] = low[u] = ++Time;
Stacks[top ++] = u;
Father[u] = fa;
int len = G[u].size(), k = , v; for(int i=; i<len; i++)
{
v = G[u][i]; if( !k && fa == v)
{
k ++;
continue;
} if( !low[v] )
{
Tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else
low[u] = min(low[u], dfn[v]);
} if(dfn[u] == low[u])
{
do
{
v = Stacks[--top];
blocks[v] = cnt;
}while(u != v);
cnt ++;
}
}
int BFS(int s,int flag)
{
int P, Pn;
queue<int> Q;
Q.push(s);
memset(step, -, sizeof(step));
step[s] = ;
while( Q.size() )
{
P = Q.front();
Q.pop(); int len = G2[P].size(); for(int i=; i<len; i++)
{
Pn = G2[P][i]; if( step[Pn] == -)
{
step[Pn] = step[P] + ;
Q.push(Pn);
}
}
} if(flag == )
return P;
return step[P];
}
void solve()
{
int ans = , i;
for(i=; i<=n; i++)
{
if(!low[i])
Tarjan(i, i);
} for(i=; i<=n; i++)
{
int v = Father[i]; if(blocks[i] != blocks[v])
{ /**重新构图*/
G2[blocks[i] ].push_back(blocks[v]);
G2[blocks[v] ].push_back(blocks[i]);
}
} int p = BFS(,);///以0为起点经行一次BFS返回最远距离的编号 ans = cnt - BFS(p, ) - ;///返回最远距离的长度
printf("%d\n", ans); } int main()
{
while(scanf("%d %d",&n, &m), m+n)
{
init();
while(m--)
{
int a, b;
scanf("%d %d",&a, &b);
G[a].push_back(b);
G[b].push_back(a);
}
solve();
}
return0;
}
/*
5 4
1 2
1 3
1 4
2 5
*/
HDU 4612 Warm up(手动扩栈,求树上哪两个点的距离最远)的更多相关文章
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- HDU 4612 Warm up —— (缩点 + 求树的直径)
题意:一个无向图,问建立一条新边以后桥的最小数量. 分析:缩点以后,找出新图的树的直径,将这两点连接即可. 但是题目有个note:两点之间可能有重边!而用普通的vector保存边的话,用v!=fa的话 ...
- Hdu 4612 Warm up (双连通分支+树的直径)
题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- HDU 4612 Warm up(2013多校2 1002 双连通分量)
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- HDU 4612——Warm up——————【边双连通分量、树的直径】
Warm up Time Limit:5000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- hdu 4612 Warm up(无向图Tarjan+树的直径)
题意:有N个点,M条边(有重边)的无向图,这样图中会可能有桥,问加一条边后,使桥最少,求该桥树. 思路:这个标准想法很好想到,缩点后,求出图中的桥的个数,然后重建图必为树,求出树的最长直径,在该直径的 ...
- HDU 4612 Warm up(Tarjan)
果断对Tarjan不熟啊,Tarjan后缩点,求树上的最长路,注意重边的处理,借鉴宝哥的做法,开标记数组,标记自己的反向边. #pragma comment(linker, "/STACK: ...
- HDU 4612 Warm up(双连通分量缩点+求树的直径)
思路:强连通分量缩点,建立一颗新的树,然后求树的最长直径,然后加上一条边能够去掉的桥数,就是直径的长度. 树的直径长度的求法:两次bfs可以求,第一次随便找一个点u,然后进行bfs搜到的最后一个点v, ...
随机推荐
- LDAP7卸载
3 Uninstalling Directory Server Enterprise Edition This chapter provides instructions for uninstalli ...
- ASP.NET Boilerplate 工作单元
从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...
- mysql隐藏文件一定要删除彻底
之前部署自己的服务器机器的时候 机器的mysql密码是不知道的.彻底删除了软件之后还是解决不了问题,而且我把MYSQL在C盘的隐藏文件也给删除了.但是还是不行 最后我偶然发现一个方法去找隐藏问题.我之 ...
- 读取xml时,遇到xmlns的问题
1.读取xml的时候,由于xml里有xmlns的属性,导致了读xml无法正常读取.通过网上搜索,发现需要先注册命名空间. xmlns是XML Namespaces的缩写,中文名称是XML(标准通用标 ...
- linux教程:配置Tomcat开机启动
我们在linux下安装好tomcat之后:经常是需要配置到开机启动的: 这样的话就不需要我们每次重启linux服务器之后自己在登陆运行startup.sh文件启动tomcat了 本次的演示环境是在ce ...
- MVC中javascript直接调用Model
最近做一个统计页面, Model从后台已经获取了数据集合,想直接在前台展示,而这个展示是需要用js生成图表的. 控制器部分代码: public ActionResult Index() { var m ...
- java 进制.
/* 整数的'3'种表现形式: 1,十进制. 2,八进制. 3,十六进制. */ public class IntegerDemo { public static void main(String[] ...
- What and where are the stack and heap?
The stack is the memory set aside as scratch space for a thread of execution. When a function is cal ...
- 【转】 OC基础数据类型-NSSet
原文 : http://www.cnblogs.com/GISerYang/p/3340937.html 1.集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过 ...
- chdir 改变当前目录为起始目录
<?php chdir(dirname(__FILE__));//把当前目录设置为当前目录?> 将 PHP 的当前目录改为 directory. 参数 directory 新的当前目录 返 ...