HDU 4612 Warm up(Tarjan)
果断对Tarjan不熟啊,Tarjan后缩点,求树上的最长路,注意重边的处理,借鉴宝哥的做法,开标记数组,标记自己的反向边。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;
#define N 200001
#define M 2000001
#define INF 0x3f3f3f3f
struct node
{
int u,v,next;
}edge[M];
struct na
{
int u,v,w,next;
}tree[M];
int first[N],DFN[N],Belong[N],stack[N],Low[N],cnum[N];
int in[N],d[N],fr[N];
int qu[M],qv[M];
int n,m;
bool vis[M];
int tot,scnt,top;
void CL()
{
tot = scnt = top = ;
memset(first,-,sizeof(first));
memset(fr,-,sizeof(fr));
memset(in,,sizeof(in));
memset(DFN,,sizeof(DFN));
memset(vis,,sizeof(vis));
}
void add(int u,int v)
{
edge[tot].u = u;
edge[tot].v = v;
edge[tot].next = first[u];
first[u] = tot ++;
}
void addt(int u,int v)
{
tree[tot].u = u;
tree[tot].v = v;
tree[tot].w = ;
tree[tot].next = fr[u];
fr[u] = tot ++;
}
void Tarjan(int u,int num)
{
int v,i;
DFN[u] = Low[u] = ++ tot;
stack[top++] = u;
in[u] = ;
for(i = first[u];i != -;i = edge[i].next)
{
v = edge[i].v;
if(vis[i]) continue;
vis[i] = vis[i^] = ;
if(!DFN[v])
{
//printf("cc%d %d",v,i);
Tarjan(v,i);
Low[u] = min(Low[u],Low[v]);
}
else if(in[v])
{
Low[u] = min(Low[u],DFN[v]);
}
}
if(DFN[u] == Low[u])
{
scnt ++;
do
{
v = stack[--top];
Belong[v] = scnt;
in[v] = ;
cnum[scnt] ++;
}while(u != v);
}
}
int spfa(int x)
{
int i,key,v,u,minz = ;
for(i = ;i <= scnt;i ++)
{
in[i] = ;
d[i] = INF;
}
queue<int> que;
in[x] = ;
d[x] = ;
que.push(x);
while(!que.empty())
{
u = que.front();
in[u] = ;
que.pop();
for(i = fr[u];i != -;i = tree[i].next)
{
v = tree[i].v;
if(d[v] > d[u] + tree[i].w)
{
d[v] = d[u] + tree[i].w;
if(!in[v])
{
in[v] = ;
que.push(v);
}
}
}
}
for(i = ;i <= scnt;i ++)
{
if(minz < d[i])
{
minz = d[i];
key = i;
}
}
return key;
}
int main()
{ int i,u,v,str,x;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n == &&m == ) break;
CL();
for(i = ;i <= m;i ++)
{
scanf("%d%d",&u,&v);
if(i == )
str = u;
qu[i] = u;
qv[i] = v;
add(u,v);
add(v,u);
}
tot = ;
Tarjan(u,);
tot = ;
for(i = ;i <= m;i ++)
{
if(Belong[qu[i]] != Belong[qv[i]])
{
addt(Belong[qu[i]],Belong[qv[i]]);
addt(Belong[qv[i]],Belong[qu[i]]);
}
}
if(scnt == )
printf("0\n");
else
{
x = spfa(spfa());
printf("%d\n",scnt-d[x]-);
}
}
return ;
}
HDU 4612 Warm up(Tarjan)的更多相关文章
- HDU 4612 Warm up tarjan 树的直径
Warm up 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 Description N planets are connected by ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- Hdu 4612 Warm up (双连通分支+树的直径)
题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...
- 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
http://acm.hdu.edu.cn/showproblem.php?pid=4612 将原图进行缩点 变成一个树 树上每条边都是一个桥 然后加一条边要加在树的直径两端才最优 代码: #incl ...
- 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(缩点+树上最长链)
本来就是自己负责图论,结果水了= = 题目其实很裸,就是求桥的数量,只是要新加上一条边罢了.做法:先缩点.再在树上搜最长链(第一场多校的hdu 4607Park Visit就考了最长链,小样,套个马甲 ...
- 【HDU 4612 Warm up】BCC 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 题意:一个包含n个节点m条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...
随机推荐
- 【SpringMVC】SpringMVC系列14之SpringMVC国际化
14.SpringMVC国际化 14.1.概述 14.2.用户切换选择语言
- JVM调优浅谈
1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...
- 《转》VS2012发布网站详细步骤
本文转载自MannyGuo 如果给您带来不便请联系博主 1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击& ...
- div隐藏
<div style="display:none"> <textarea id="BodyBox2" runa ...
- poj 1318
http://poj.org/problem?id=1318 这个题目还是比较水的,不过也可以提升你对字符串的熟悉度以及对一些排序函数和字符函数的使用. 大概的题意就是给你一个字典,这个字典有一些单词 ...
- IOS多线程(NSThread)
1.创建方法 使用NSThread创建线程主要有两个个方法,分别如下 NSThread* myThread = [[NSThread alloc] initWithTarget:self sele ...
- java call sap
1.下载需要的jar,windows用dll,linux用so win下载地址 linux下载地址 win下载地址new 2.环境: windows -> sapjco3.dll放到wi ...
- 消息队列入门(四)ActiveMQ的应用实例
>>部署和启动ActiveMQ 去官网下载:http://activemq.apache.org/ 我下载的是apache-activemq-5.12.0-bin.tar.gz, 解压到本 ...
- UML中的依赖关系
UML中的五种关系和设计模式中的代码实现. 又重新听了一遍UML中的关系.感觉又是收获很大. UML中的关系有依赖,关联(聚合,组合),泛化(也叫继承),实现 现在一个一个的来实现: 一:依赖 依赖关 ...
- open(/dev/ietctl, O_RDWR) 参数含义(转载)
这是文件I/O的常用函数,open函数,open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值,那么这个值代表的就是文件描述符.一般的写法是i ...