hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点,
然后建树,求出树的直径,在直径起点终点加一条边去的桥最多,
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<stdio.h>
- #include<string.h>
- #include<stack>
- #define N 200001
- using namespace std;
- int belong[N],head[N],num,ins[N],n,dfs[N],low[N],idx,ans,num1;
- struct edge
- {
- int st,ed,next;
- }E[N*10],e[N*10];
- void addedge(int x,int y)
- {
- E[num].st=x;
- E[num].ed=y;
- E[num].next=head[x];
- head[x]=num++;
- }
- void Addedge(int x,int y)
- {
- e[num1].st=x;
- e[num1].ed=y;
- e[num1].next=head[x];
- head[x]=num1++;
- }
- stack<int>Q;
- void Tarjan(int u,int father)
- {
- int i,j,v,flag=0;
- low[u]=dfs[u]=idx++;
- Q.push(u);
- for(i=head[u];i!=-1;i=E[i].next)
- {
- j=E[i].ed;
- if(dfs[j]==-1)
- {
- Tarjan(j,u);
- low[u]=low[u]>low[j]?low[j]:low[u];
- }
- else if(j==father)
- {
- if(flag)
- low[u]=low[u]>dfs[j]?dfs[j]:low[u];
- flag++;
- }
- else low[u]=low[u]>dfs[j]?dfs[j]:low[u];
- }
- if(dfs[u]==low[u])
- {
- do
- {
- v=Q.top();
- Q.pop();
- belong[v]=ans;
- }while(v!=u);
- ans++;
- }
- }
- void read()
- {
- memset(head,-1,sizeof(head));
- num1=0;
- for(int i=0;i<num;i+=2)
- {
- int x=belong[E[i].st];
- int y=belong[E[i].ed];
- if(x==y)continue;
- Addedge(x,y);
- Addedge(y,x);
- }
- }
- int dis;
- int dist(int u)
- {
- ins[u]=1;
- int max=0,mmax=0;
- for(int i=head[u];i!=-1;i=e[i].next)
- {
- int v=e[i].ed;
- if(ins[v]==1)continue;
- int temp=dist(v);
- if(temp>mmax)
- {
- max=mmax;
- mmax=temp;
- }
- else if(temp>max)
- {
- max=temp;
- }
- }
- if(dis<(mmax+max+1))
- dis=mmax+max+1;
- return mmax+1;
- }
- int main()
- {
- int i,m,x,y;
- while(scanf("%d%d",&n,&m),n||m)
- {
- memset(head,-1,sizeof(head));
- num=0;
- for(i=0;i<m;i++)
- {
- scanf("%d%d",&x,&y);
- addedge(x,y);
- addedge(y,x);
- }
- memset(dfs,-1,sizeof(dfs));
- memset(low,-1,sizeof(low));
- memset(ins,0,sizeof(ins));
- idx=ans=0;
- Tarjan(1,-1);
- read();
- memset(ins,0,sizeof(ins));
- dis=0;
- dist(1);
- printf("%d\n",ans-dis);
- }
- return 0;
- }
hdu 4612 (双联通+树形DP)的更多相关文章
- hdu 4612 双联通缩点+树形dp
#pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> ...
- hdu 2242双联通分量+树形dp
/*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价
Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/ ...
- HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)
<题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- hdu 5452 Minimum Cut 树形dp
Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- HDU 1520 Anniversary party [树形DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...
- hdu 1520Anniversary party(简单树形dp)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- 【转】notepad++ 应用学习 -- 列模式,十六进制模式
Notepad++ 顾名思义,是一个比notepad(Windows下叫记事本)的功能更强的编辑器. 总以为notepad++小巧轻盈,而且开源,要比UE(UltraEdit)好用.因为她支持的视 ...
- 精选7款绚丽的HTML5和jQuery图片动画特效
在HTML5出现后,图片就变得更加富有动感了,各种图片动画特效也层出不穷,例如图片播放器.图片导航.3D图片动画等等.本文将精选几款具有代表性的HTML5和jQuery图片动画特效,绚丽的画面.实用的 ...
- 食物卡喉别拍背部!救了100多万人性命的“海姆立克急救法"
先讲三个事例: 一.近日,浙江金华一个17月大的小贝边玩边吃花生,被噎住.10多分钟后,奶奶发现小贝大口喘气,以为他玩累了就抱他回家,等父母赶到送医已晚.小贝大脑受损严重-父母含泪同意放弃治疗,孩子走 ...
- sed awk 要获得每行的最后一个逗号后边的内容
获得每行的最后一个逗号后边的内容.例如:KIAA1967 KIAA1967, xxxxSECIS biding proin 2-like, SECISBP2L, yyyy 1234ankyrin re ...
- Android开发之bug-No Activity found to handle Intent
android.content.ActivityNotFoundException: No Activity found to handle Intent 做Android开发中,使用隐式intent ...
- js createElement
http://www.w3schools.com/js/js_htmldom_nodes.asp var child = document.getElementById("p1" ...
- poj 1924 Paths on a Grid(组合数学)
题目:http://poj.org/problem?id=1942 题意:给定一个矩形网格的长m和高n,其中m和n都是unsigned int32类型,一格代表一个单位,就是一步,求从左下角到右上角有 ...
- 取出block所对应的hash值
/**********************************************************************//** Gets the hash value of t ...
- BZOJ_1019_[SHOI2008]_汉诺塔_(DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1019 汉诺塔游戏,但是有移动优先级,在不违反原有规则的情况下,给定优先移动目标.求完成游戏所需 ...
- 【 D3.js 选择集与数据详解 — 5 】 处理模板的应用
在[选择集与数据 - 4]一文中,介绍了一个update.enter.exit的处理模板,这个模板很常用,本文将通过一个例子来讲解其使用方法. 1. 模板 复习一下上一章提到的模板. //绑定数据后, ...