(求树的直径)Warm up -- HDU -- 4612
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612
给一个无向图, 加上一条边后,求桥至少有几个;
那我们加的那条边的两个顶点u,v;一定是u,v之间含有桥的数量最多,然后uv之间的桥都没了,剩下的就是要求的结果;
树的直径的定义刚好就是两个节点之间含有最多的边;
下面是有关树的直径的知识;
这个题目需要手动扩展,不然会爆栈,而且手动扩展的话要用C++提交。
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define N 200005
int Head1[N], Head2[N], cnt[];
int Stack[N], top, dfn[N], low[N], Time, n, m;
int nBridge, Bridge[N];
int dist[N], vis[N], Max, index;
struct Edge
{
int v, next;
} e1[*N], e2[*N];
void Init()
{
top = nBridge = Time = Max = index = ;
cnt[] = cnt[] = ;
memset(low, , sizeof(low));
memset(dfn, , sizeof(dfn));
memset(Bridge, , sizeof(Bridge));
memset(dist, , sizeof(dist));
memset(Stack, , sizeof(Stack));
memset(Head1, -, sizeof(Head1));
memset(Head2, -, sizeof(Head2));
}
void Add(Edge e[],int Head[], int u, int v, int k)
{
e[cnt[k]].v = v;
e[cnt[k]].next = Head[u];
Head[u] = cnt[k]++;
}
void Tarjar(int u, int father)
{
low[u] = dfn[u] = ++Time;
Stack[top++] = u;
int v, k=;
for(int i=Head1[u]; i!=-; i=e1[i].next)
{
v = e1[i].v;
if(v==father && !k)///避免重边;
{
k++;
continue;
}
if(!dfn[v])
{
Tarjar(v, u);
low[u] = min(low[u], low[v]);
}
else
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u])
{
nBridge++;///可以代表缩点后的节点个数;
while()
{
v = Stack[--top];
Bridge[v] = nBridge;///缩点;
if(u==v)
break;
}
}
}
void bfs(int s)
{
queue<int>Q;
int p, q;
memset(vis, , sizeof(vis));
vis[s] = ;
dist[s] = ;
Q.push(s);
while(!Q.empty())
{
p = Q.front(); Q.pop();
for(int i=Head2[p]; i!=-; i=e2[i].next)
{
q = e2[i].v;
if(!vis[q])
{
vis[q] = ;
dist[q] = dist[p] + ;
Q.push(q);
if(Max<dist[q])
{
Max = dist[q];
index = q;
}
}
}
}
}
int main()
{
int u, v;
while(scanf("%d%d", &n, &m), m + n)
{
Init();
for(int i=; i<=m; i++)
{
scanf("%d%d", &u, &v);
Add(e1, Head1, u, v, );
Add(e1, Head1, v, u, );///原来的树;
}
Tarjar(, );
for(int i=; i<=n; i++)
{
for(int j=Head1[i]; j!=-; j=e1[j].next)
{
int u = Bridge[i];
int v = Bridge[e1[j].v];
if(u != v )
{
Add(e2, Head2, u, v, );
Add(e2, Head2, v, u, );///缩点后的树;
}
}
}
bfs();
bfs(index);///求树的直径的过程;
printf("%d\n", nBridge--Max);///缩点后形成的树每条边都是桥;所以总桥的个数为节点数-1;
}
return ;
}
(求树的直径)Warm up -- HDU -- 4612的更多相关文章
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- 4612 warm up tarjan+bfs求树的直径(重边的强连通通分量)忘了写了,今天总结想起来了。
问加一条边,最少可以剩下几个桥. 先双连通分量缩点,形成一颗树,然后求树的直径,就是减少的桥. 本题要处理重边的情况. 如果本来就两条重边,不能算是桥. 还会爆栈,只能C++交,手动加栈了 别人都是用 ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边
Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...
- hdu 4514 湫湫系列故事――设计风景线(求树的直径)
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置 ...
- HDU 4607 Park visit (求树的直径)
解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K &l ...
- 求树的直径+并查集(bfs,dfs都可以)hdu4514
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...
- poj2631 求树的直径裸题
题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...
随机推荐
- Haskell语言学习笔记(58)Bifoldable
Bifoldable class Bifoldable p where bifold :: Monoid m => p m m -> m bifold = bifoldMap id id ...
- 数据库索引&数据页
索引的好处 索引带来的益处可能很多读者会认为只是"能够提高数据检索的效率,降低数据库的IO成本". 确实,在数据库中表的某个字段创建索引,所带来的最大益处就是将该字段作为检索条件时 ...
- debug-stripped.ap_' specified for property 'resourceFile' does not exist.(转载)
1.错误描述 更新Android Studio到2.0版本后,出现了编译失败的问题,我clean project然后重新编译还是出现抑郁的问题,问题具体描述如下所示: Error:A problem ...
- RedisTemplate Redis 操作
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向r ...
- 70. Climbing Stairs (Array; DP)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- Codeforces Beta Round #12 (Div 2 Only)
Codeforces Beta Round #12 (Div 2 Only) http://codeforces.com/contest/12 A 水题 #include<bits/stdc++ ...
- ArrayList LinkList比较
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList优于LinkedList,因为ArrayLi ...
- virtualbox Linux与Windows共享文件
安装virtualbox增强功能 在Windows下新建文件用于共享,点设置->共享文件夹->添加共享文件,制定路径和名称(名称用于Linux中挂载使用)(选择固定分配) 在Linux中m ...
- Collections.shuffle()源码分析
Java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List<?> list) 使用默认随机源对列表进行 ...
- MyEclipse2018.9.0设置全局编码
1.windows->Preferences打开"首选项"对话框,左侧导航,导航到general->Workspace 右侧Text file encoding,选择O ...