本来就是自己负责图论,结果水了= =

题目其实很裸,就是求桥的数量,只是要新加上一条边罢了。做法:先缩点、再在树上搜最长链(第一场多校的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(缩点+树上最长链)的更多相关文章

  1. Hdu 4612 Warm up (双连通分支+树的直径)

    题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...

  2. hdu 4612 Warm up 双连通+树形dp思想

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total S ...

  3. hdu 4607 Park Visit(树上最长链)

    求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...

  4. [HDU4607]Park Visit(树上最长链)

    HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...

  5. HDU 4612 Warm up tarjan缩环+求最长链

    Warm up Problem Description   N planets are connected by M bidirectional channels that allow instant ...

  6. hdu 4612 Warm up 双连通缩点+树的直径

    首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...

  7. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  8. HDU 4612——Warm up——————【边双连通分量、树的直径】

    Warm up Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  9. HDU 4612 Warm up (边双连通分量+DP最长链)

    [题意]给定一个无向图,问在允许加一条边的情况下,最少的桥的个数 [思路]对图做一遍Tarjan找出桥,把双连通分量缩成一个点,这样原图就成了一棵树,树的每条边都是桥.然后在树中求最长链,这样在两端点 ...

随机推荐

  1. HTML5 本地裁剪图片

    下面奉上我自己写的一个demo,代码写得比较少,很多细节不会处理.如果有不得当的地方恳请指教,谢谢啦 ^_^ ^_^   功能实现步奏:   一:获取文件,读取文件并生成url   二:根据容器的大小 ...

  2. powerdesigner使用之——从“概念模型”到“物理模型”

    现实问题在计算机上的解决,需要我们从现实问题中抽象出实体模型,然后再将实体模型对应到数据库关系表中. 例如,我们在思考学生选课,这件事情上,实体模型就是“学生”和“课程”两个 此时,我们使用power ...

  3. SQL SERVER 之 填充因子

    填充因子依附索引而存在,但创建索引,就意味着要对表进行DML时,必须处理额外的工作量(也就是对索引结构的维护)以及存储方面的IO开销. 所以创建索引时,需要考虑创建索引所带来的查询性能方面的提高,与引 ...

  4. java内存分配详细论

    P.S. 想写这篇总结酝酿了有个来月了,却始终感觉还差点什么东西,一直未敢动笔. 最近两天连夜奋战,重新整理下前面查阅的资料.笔记,还是决定将它写出来. 现在提出几个问题,如果都能熟练回答的大虾,请您 ...

  5. 表中相同数据的sql语句

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from  ...

  6. jsp bean标签

    jsp中存在一个奇奇怪怪的bean标签. 例如 现在在java包中定义一个类test2 package bean; public class test { private int number; pu ...

  7. 深入浅出ES6(六):解构 Destructuring

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 什么是解构赋值? 解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性 ...

  8. java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

    1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...

  9. POJ 2400 Supervisor, Supervisee(KM)

    題目鏈接 題意 :N个部门和N个员工,每个部门要雇佣一个工人,部门对每个工人打分,从1~N,1表示很想要,N表示特别不想要,每个工人对部门打分,从1~N.1表示很想去这个部门,N表示特别不想去这个部门 ...

  10. 简单易懂的现代魔法——Play Framework攻略4

    接前文:简单易懂的现代魔法——Play Framework攻略3 1.The Object 时隔2个多月,Play Framework系列又更新了,本次的主题是:利用Play Framework实现R ...