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条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...
随机推荐
- jquery 常用类别选择器
1.$('#showDiv'): id选择器,相当于javascript中的documentgetElementById("showDiv"); 2.$("onecla ...
- mysql5.6 timestamp
1.timestamp 默认值 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这个数据列刷新 CURRENT_TIME ...
- FastReport安装说明(中文版)
FastReport安装说明(中文版) 内容列表 I. IntroductionI. 介绍II. Manual installing of the FastReport packagesII. 手动安 ...
- MongoDB副本集学习(一):概述和环境搭建
MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...
- 利用FFmpeg生成视频缩略图 2.1.8
1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ ...
- web iphone css 兼容性
解决IPHONE网页兼容(部分字号变大): body{-webkit-text-size-adjust:none;}
- JavaEE填空与判断
Java EE软件工程师认证考试 试题库- 填空题和选择题 一. 填空题 1. HTML网页文件的标记是__html__,网页文件的主体标记是_body__,标记页面标题的标记是__tit ...
- [MAC] Mac下的SVN命令行
转载自: http://www.cnblogs.com/snandy/p/4072857.html Mac自带了SVN命令行,如我的升级到10.10(OSX yosemite)后命令行版本为1.7.1 ...
- ajax(ajax开发与入门)
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX是一种进行页面局部异步刷新的技术,局 ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式
实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...