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条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...
随机推荐
- Linux的Cgroup<实例详解>
为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源.也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等.于是就 ...
- JSON: property "xxx" has no getter method in class "..."
Exception in thread "main" net.sf.json.JSONException: java.lang.NoSuchMethodException: Pro ...
- placement new讲解
[本文链接] http://www.cnblogs.com/hellogiser/p/placement-new.html [分析] 首先我们区分下几个容易混淆的关键词:new.operator ne ...
- jquery validate自定义checkbox验证规则和样式
参考:http://blog.csdn.net/xh16319/article/details/9987847 自定义checkbox验证,“检查checkbox是否选中” jQuery.valida ...
- 【转】MySQL Temporary Table相关问题的探究
本文转载自:http://itindex.net/detail/10901-mysql-temporary-table 问题的引入 让我们先来观察几条非常简单的MySQL语句: mysql> c ...
- poj2778
题意:给出字符串长度n(<=2000000000),给出不可以包含的序列,最多10个,每个长度最大是10.问长度为n的合法序列有多少个?序列中只可能包含ACTG四个字符. 分析:AC自动机(DF ...
- 用cocos2dx实现模态对话框
ui部分使用了cocoStudio,注意这里没有实现怎么屏蔽其他的输入事件,其他的文档已经太多了,我这里使用的cocoStudio的控件自己的特性. 这里强烈推荐一下cocoStudio,虽然现在还有 ...
- VC++遇到的错误汇集
1.在程序头添加#include "stdafx.h" 和#include <afx.h>时会出现以下错误 在Win32Project下使用,出现“error C118 ...
- 利用FFmpeg生成视频缩略图 2.1.6
利用FFmpeg生成视频缩略图 1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/build ...
- [MAC] SVN lock的使用
转载 : http://www.eefocus.com/czzheng/blog/12-03/245532_4ca94.html 如果压根没有锁lock,那么每个人都拥有一个本地copy,每个人都能自 ...