hdu 4612 Warm up(缩点+树上最长链)
本来就是自己负责图论,结果水了= =
题目其实很裸,就是求桥的数量,只是要新加上一条边罢了。做法:先缩点、再在树上搜最长链(第一场多校的hdu 4607Park Visit就考了最长链,小样,套个马甲以为就认不出你了),加边后求桥数就可以了。
犯了一大三小四个错误-_-
竟然真的去套模板求桥数了。。竟然没注意到树边都是桥,用树边减链边就可以了。
然后,重新建图的Build()把n传进去了。
再然后,发现读数据从0~m-1,Build()里竟然是1~m。
再再然后,原来存边的su[],sv[]数组开成了 MAXN。
#pragma comment(linker, "/STACK:10240000000000,10240000000000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std; const int MAXM=;
const int MAXN=; struct Edge{
int u,v,next;
int vis;
Edge(){}
Edge(int _u,int _v,int _next):u(_u),v(_v),next(_next),vis(){}
}edge[MAXM<<]; int brige[MAXM<<]; struct Q{
int p,c;
}q[MAXN]; int head[MAXN],tol;
int stk[MAXN],top;
int low[MAXN],dfn[MAXN],TT;
int belong[MAXN],scc; int vis[MAXN]; int su[MAXM],sv[MAXM]; int son; void init()
{
tol=;
memset(head,-,sizeof(head));
} void add(int u,int v)
{
edge[tol]=Edge(u,v,head[u]);
head[u]=tol++;
} void tarjan(int u)
{
int v;
stk[++top]=u;
low[u]=dfn[u]=++TT;
for(int i=head[u];i!=-;i=edge[i].next)
{
if(edge[i].vis)
continue;
edge[i].vis=edge[i^].vis=; v=edge[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else {
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
scc++;
do{
v=stk[top--];
//ins[v]=0;
belong[v]=scc;
}while(v!=u);
}
} void Build(int m)
{
init();
for(int i=;i<m;i++)
{
int u=su[i],v=sv[i];
if(belong[u]!=belong[v]){
add(belong[u],belong[v]);
add(belong[v],belong[u]);
}
}
} int bfs(int x)
{
int l,r,u; l=r=;
q[r].p=x;
q[r++].c=;
memset(vis,,sizeof(vis));
vis[x]++;
while(l<r)
{
u=q[l].p;
int c=q[l++].c;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v]){
q[r].p=v;
q[r++].c=c+;
vis[v]=;
}
}
}
return u;
} int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m)
return ;
init();
for(int i=;i<m;i++)
{
scanf("%d%d",&su[i],&sv[i]);
add(su[i],sv[i]);
add(sv[i],su[i]);
}
scc=;top=;TT=;
memset(dfn,,sizeof(dfn));
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i); Build(m); int u=bfs();
int v=bfs(u);
printf("%d\n",scc-q[scc-].c);
}
return ;
}
/*
8 9
1 2
2 3
3 4
4 1
5 6
6 7
7 8
8 5
4 5 8 8
1 2
2 3
3 4
5 6
6 7
7 8
8 5
4 5 8 8
1 2
2 3
3 4
2 5
5 6
6 7
7 8
8 6 8 9
1 2
2 3
3 4
2 5
5 6
6 7
7 8
8 6
4 5 7 8
1 2
2 3
3 4
4 5
5 6
6 1
3 7
7 4
*/
hdu 4612 Warm up(缩点+树上最长链)的更多相关文章
- Hdu 4612 Warm up (双连通分支+树的直径)
题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- hdu 4607 Park Visit(树上最长链)
求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...
- [HDU4607]Park Visit(树上最长链)
HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- hdu 4612 Warm up 双连通缩点+树的直径
首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- HDU 4612——Warm up——————【边双连通分量、树的直径】
Warm up Time Limit:5000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- HDU 4612 Warm up (边双连通分量+DP最长链)
[题意]给定一个无向图,问在允许加一条边的情况下,最少的桥的个数 [思路]对图做一遍Tarjan找出桥,把双连通分量缩成一个点,这样原图就成了一棵树,树的每条边都是桥.然后在树中求最长链,这样在两端点 ...
随机推荐
- Win7(包括32和64位)使用GitHub
关于安装路径:32位可选择安装目录,但64位建议使用默认安装目录,否则Git Extensions配置会出问题 安装参考网址 http://code.google.com/p/tortoisegit/ ...
- uva 10131
DP 先对大象体重排序 然后寻找智力的最长升序子列 输出路径.... #include <iostream> #include <cstring> #include &l ...
- jstl if条件判断字符串代码
<c:if test="${netWorkInfo.networkType eq '快修店'}"> <input type="radio" n ...
- RFID开发笔记 Alien阅读器文档
1. 开机使用serial connect,完成boot后使用TCP/IP协议与主机通信 2.TagList,是一个活跃标签的列表,这里活跃的含义是在一个间隔里被监听到.如果一个标签之前没有被监听到, ...
- 一个Java程序员应该掌握的10项技能
1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:a ...
- hdoj 2112 HDU Today
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2112 分析:多了一个地方的条件,用map来映射地点编号,Dijkstra求解即可 //2013-10- ...
- SDUT2141数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2141&cid=1186 #include<cstdio> #include& ...
- Android 打开闪光灯(手电筒)
package com.example.openBackLight; import android.app.Activity; import android.hardware.Camera; impo ...
- http://blog.csdn.net/superhosts/article/details/15813247
http://blog.csdn.net/superhosts/article/details/15813247
- 【Linux高频命令专题(2)】awk
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...