F - Warm up - hdu 4612(缩点+求树的直径)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std; const int MAXN = 2e5+; struct Edge{int v, vis, next;}e1[MAXN*], e2[MAXN*];
int Head1[MAXN], Head2[MAXN], cnt[], fa[MAXN];
void AddEdge(Edge e[], int Head[], int u, int v, int k)
{
e[ cnt[k] ].v = v;
e[ cnt[k] ].vis = ;
e[ cnt[k] ].next = Head[u];
Head[u] = cnt[k]++;
} struct node{int u, step;};
node BFS(node s, int k)
{
queue<node> Q;
Q.push(s); while(Q.size())
{
s = Q.front();Q.pop(); for(int j=Head2[s.u]; j!=-; j=e2[j].next)
{
node q = s;
q.u = e2[j].v; if(e2[j].vis != k)
{
e2[j].vis = e2[j^].vis = k;
q.step++;
Q.push(q);
}
} } return s;
} int dfn[MAXN], low[MAXN], Index;
int belong[MAXN], bnt;
int Stack[MAXN], top; void InIt(int N)
{
cnt[] = cnt[] = Index = bnt = top = ;
for(int i=; i<=N; i++)
{
Head1[i] = Head2[i] = -;
dfn[i] = ;
fa[i] = ;
}
}
void Tarjan(int u)
{
int v; low[u] = dfn[u] = ++Index;
Stack[++top] = u; for(int j=Head1[u]; j!=-; j=e1[j].next)
{
v = e1[j].v;
if(e1[j].vis == false)
{
e1[j].vis = e1[j^].vis = true;
if( !dfn[v] )
{
Tarjan(v);
low[u] = min(low[u], low[v]);
}
else
low[u] = min(low[u], dfn[v]);
}
} if(low[u] == dfn[u])
{
++bnt;
do
{
v = Stack[top--];
belong[v] = bnt;
}
while(u != v);
}
}
int main()
{
int N, M; while(scanf("%d%d", &N, &M), N+M)
{
int i, j, u, v; InIt(N); while(M--)
{
scanf("%d%d", &u, &v);
AddEdge(e1, Head1, u, v, );
AddEdge(e1, Head1, v, u, );
} Tarjan(); for(i=; i<=N; i++)
for(j=Head1[i]; j!=-; j=e1[j].next)
{
v = e1[j].v;
u = belong[i], v = belong[v];
if(u > v && fa[v] != u)
{
fa[v] = u;
AddEdge(e2, Head2, u, v, );
AddEdge(e2, Head2, v, u, );
}
} node s;
s.u = , s.step = ; s = BFS(s, );
s.step = ;
s = BFS(s, ); printf("%d\n", bnt-s.step-);
} return ; }
F - Warm up - hdu 4612(缩点+求树的直径)的更多相关文章
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
- HDU 4607 Park visit (求树的直径)
解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K &l ...
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
- HDU 4612 Warm up(双连通分量缩点+求树的直径)
思路:强连通分量缩点,建立一颗新的树,然后求树的最长直径,然后加上一条边能够去掉的桥数,就是直径的长度. 树的直径长度的求法:两次bfs可以求,第一次随便找一个点u,然后进行bfs搜到的最后一个点v, ...
- HDU 4612 Warm up —— (缩点 + 求树的直径)
题意:一个无向图,问建立一条新边以后桥的最小数量. 分析:缩点以后,找出新图的树的直径,将这两点连接即可. 但是题目有个note:两点之间可能有重边!而用普通的vector保存边的话,用v!=fa的话 ...
- hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径
题意如上,含有重边(重边的话,俩个点就能够构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选随意起点U,进行bfs,到达最远的一个点v ...
- hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径
题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v ...
- (求树的直径)Warm up -- HDU -- 4612
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥至少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之 ...
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
随机推荐
- Android系统移植与驱动开发——第七章——LED驱动
LED驱动的实现原理 编写LED驱动: 测试LED驱动之前需要用USB数据线连接开发板,然后打开电源,成功启动之后,执行build.sh脚本文件编译和安装LED驱动,顺利则会自动连接 如果有多个设备文 ...
- Android开发手记(24) Log的使用及颜色的更改
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文 ...
- Eclipse4.4安装旧版本插件报错 Failed to prepare partial IU
Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0.8. work around: go to Help -> ...
- sql - Invalid object name 'dbo.in$'
这是我从excel导入的表,用查询的时候,不加前面部分的'dbo',能查出来,好像是owner的原因吧.
- 直接拿来用的15个jQuery代码片段
1.预加载图片 1 2 3 4 5 6 7 8 9 10 11 12 (function($) { var cache = []; // Arguments are image paths r ...
- 【转】 iOS 两种方法实现左右滑动出现侧边菜单栏 slide view
原文: http://blog.csdn.net/crayondeng/article/details/9057637 --- 关于评论中,很多网友都是需要这部分的相关源码,其实在我上传的新浪微博 ...
- 创建cocos项目
创建cocos项目 进入终端输入命令: cocos new HelloCpp -p com.cocos.org -l cpp -d /Users/emerys/documents/cocos 参数说明 ...
- MySQL 创建数据库
MySQL 创建数据库 使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以 ...
- iOS开发,新手入门指导
在做了近两年wp,安卓开发之后,某一天突然决定投身iOS的开发之中. 因为一直用的mac,做wp开发的时候都用双系统,vs开久了,就会比较烫,这点让人不爽.后来更多地做安卓,直接mac下开发,很舒适的 ...
- 初涉JavaScript模式系列 阶段总结及规划
总结 不知不觉写初涉JavaScript模式系列已经半个月了,没想到把一个个小点进行放大,竟然可以发现这么多东西. 期间生怕对JS的理解不到位而误导各位,读了很多书(个人感觉JS是最难的oo语言),也 ...