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

题目其实很裸,就是求桥的数量,只是要新加上一条边罢了。做法:先缩点、再在树上搜最长链(第一场多校的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. IOS7 适配时导航栏变黑

    当适配IOS的布局时遇到问题:导航栏和菜单栏后台会变黑色. self.edgesForExtendedLayout = UIRectEdgeNone; 原因是系统默认这两个控件是半通明的. 解决方案: ...

  2. spoj 274

    离散化   枚举行  扫描横坐标 #include <iostream> #include <cstdio> #include <cstring> #include ...

  3. [SQL Server系] -- 约束

    什么是约束? 约束(Constraint)是SQL Server中提供的 自动保存数据库完整性 的一种方法,定义了可输入表或表的列中的数据限制条件. SQL Server中共有5中约束 PRIMARY ...

  4. 内存对齐-C语言struct内存占用问题

    转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi ...

  5. ASP .net(照片列表详细功能演示)

    大家好,今天我们需要讲解的内容就是把上篇文章当中提到的照片列表的很多功能细化去做. 那么之间我们两篇文章的目的就是要让大家深刻体会get,post的使用场景极其作用.像一般处理程序的使用,隐藏域的使用 ...

  6. lintcode :sort letters by case字符大小写排序

    题目 字符大小写排序 给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序. 您在真实的面试中是否遇到过这个题? Yes 样例 给出"abAcD",一个可能的答案为& ...

  7. [SharePoint 2013 入门教程 2 ] 创建WEB应用程序,网站集,网站

    SharePoint 2013 的 Hello World 由大到小  创建WEB应用程序(老母),网站集(儿子),网站(孙子) 直接确定,其余都默认 填入标题,选好模板.网站集 儿子就有了. 点击页 ...

  8. Linux文件系统介绍

    1.ext2/ext3(日志功能)文件系统(Linux标准文件系统.一种索引式文件系统) SuperBlock:Superblock是记录整个filesystem 相关信息的地方,没有Superblo ...

  9. 实用Photoshop快捷键

    面板快捷键:shift+对应的快捷键调用同类工具 Ctrl + 点击面板------获取选取 Shift + F6-----------羽化 Alt + Delete---------填充前景色 Ct ...

  10. C#中用JavaScriptSerializer和Json.Net操作json格式的文件

    1.json文件 2.写出对应的类 //折扣 public class Discount { public string Qty { get; set; } public string percent ...