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找出桥,把双连通分量缩成一个点,这样原图就成了一棵树,树的每条边都是桥.然后在树中求最长链,这样在两端点 ...
随机推荐
- oracle一些函数
NVL( string1, replace_with):判断string1是否为空,如果是空就用replace_with代替. NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回 ...
- JQuery绑定和注销事件
$('#action_list > li').each(function(){ $(this).unbind('click') .bind('click', function(){ /** so ...
- SQL语句备忘
SELECT beatid,COUNT(d.id) dongnicount FROM `bed_beat_dongni` d INNER JOIN bed_beat b on b.id = d.bea ...
- 1> Strut2 Mapping to MVC
CONTROLLER—FILTERDISPATCHER We’ll start with the controller. It seems to make more sense to start th ...
- VS2010 MFC DataGrid绑定实例
VS2010环境下MFC使用DataGrid绑定数据源 参考:http://blog.csdn.net/fddqfddq/article/details/7874706 详细介绍如何在MFC中使用Da ...
- sublime text3 配置插件包记录
前言: 很多插件已经开始放弃支持ST2了,所以推荐使用ST3,大量的最新插件和最新功能已经不再支持st2了. 下载地址戳这里:http://www.sublimetext.com/3 1.所有插件 易 ...
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- ios APP屏幕快照尺寸
苹果上传APP审核需要上传APP屏幕快照,分别有3.5寸,4寸,4.7寸,5.5寸,ipad五种图片,对应尺寸大小: 3.5寸:横坚屏 640*960 或960*640 4寸:横坚屏 640*1036 ...
- LR_问题_无法使用LR的Controller,提示缺少license
问题描述 无法使用LR的Controller,提示缺少license 问题解决 使用开始->所有程序->HP LoadRunner->loadrunner,在打开界面的左上角选择co ...
- Xamarin.Android 入门之:Android API版本设置
一.引言 Xamarin.Android有几个Android API级别设置,确定多个版本的Android应用程序的兼容性.本博客解释了这些设置意味着什么,如何配置它们,以及它们在运行时对您的应用程序 ...