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, ...
随机推荐
- [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中
近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...
- Spire.Barcode好用的条码生在组件
由于项目的需要,今天在网上找了一下条码的组件,发现了一个简单易用的组件,使用简单,几句代码就搞定了.
- WPF TextSelection获取选中部分内容
一.简单实例 //TextSelect继承自TextRange TextSelection selection = richTextBox.Selection; //1.获取选中内容 string r ...
- 关于一点coding.net与git配合在AndroidStudio/Idea上的使用笔记个的
编写程序的我们经常需要对我们写的代码做版本控制,或者分支管理,具备类似功能的软件很多,诸如SVN,Git,CVS等等!但配置版本控制服务器(SVN server etc.)是繁琐的并且需要一定的成本! ...
- JAVA开发环境 - 环境变量及配置
JDK是什么?JRE是什么? JRE(Java Runtime Environment):Java运行环境: JDK(Java Development Kit):Java开发工具包,里面已经包含JRE ...
- 谷歌地图实现车辆轨迹移动播放(google map api)
开发技术:jquery,js baidu map api,json,ajax QQ1310651206 谷歌地图(google map api)实现车辆轨迹移动播放(google map api)
- javascript为目标位置div等设置高度
应该是DOM的东西: document.getElementById("目标id").style.height = 多高(数值)+"px";
- 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
单元测试不好搞阿,虽然从TDD角度出发,可测性强的代码很大程度上就代表着好的设计,但是有些情况也是没办法的,比如单例模式,比如Static方法,比如Final类,传统的Mock技术是没办法解决这些问题 ...
- BZOJ 1019 汉诺塔
Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操 ...
- 巧用powerpoint制作符合期刊要求的复合图