hdu 4612 双联通缩点+树形dp
- #pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了
- #include<stdio.h>
- #include<queue>
- #include<string.h>
- using namespace std;
- #define N 210000
- #define inf 99999999
- struct node {
- int u,v,w,next;
- }bian[N*20],biantwo[N*20];
- int head[N],yong,dfn[N],low[N],yongtwo,index,top,cnt,stac[N],visit[N];
- int suo[N];
- void init(){
- memset(head,-1,sizeof(head));
- memset(dfn,0,sizeof(dfn));
- memset(low,0,sizeof(low));
- memset(visit,0,sizeof(visit));
- index=0;top=0;cnt=0;yong=0;
- yongtwo=0;
- }
- void addedge(int u,int v) {
- bian[yong].u=u;
- bian[yong].v=v;
- bian[yong].next=head[u];
- head[u]=yong++;
- }
- void addedgetwo(int u,int v,int w) {
- biantwo[yongtwo].u=u;
- biantwo[yongtwo].v=v;
- biantwo[yongtwo].w=w;
- biantwo[yongtwo].next=head[u];
- head[u]=yongtwo++;
- }
- int Min(int a,int b) {
- return a>b?b:a;
- }
- void tarjan(int u,int pre) {//双联通缩点
- int i;
- dfn[u]=low[u]=++index;
- stac[++top]=u;
- visit[u]=1;
- for(i=head[u];i!=-1;i=bian[i].next) {
- int v=bian[i].v;
- if(i==(pre^1))continue;
- if(!dfn[v]) {
- tarjan(v,i);
- low[u]=Min(low[u],low[v]);
- }
- else
- if(visit[v])
- low[u]=Min(low[u],dfn[v]);
- }
- if(low[u]==dfn[u]){
- ++cnt;
- int t;
- do{
- t=stac[top--];
- suo[t]=cnt;
- visit[t]=0;
- }while(t!=u);
- }
- }
- int dis[N],n;
- int bfs(int u) {//求树的直径
- int i,vis[N],j;
- queue<int>q;
- memset(vis,0,sizeof(vis));
- for(i=1;i<=cnt;i++)
- dis[i]=inf;
- q.push(u);
- vis[u]=1;
- dis[u]=0;
- while(!q.empty()) {
- int d=q.front();
- q.pop();
- for(i=head[d];i!=-1;i=biantwo[i].next) {
- int v=biantwo[i].v;
- if(vis[v]==0&&dis[v]>dis[d]+biantwo[i].w){
- dis[v]=dis[d]+biantwo[i].w;
- vis[v]=1;
- q.push(v);
- }
- }
- }
- int mi=inf,temp;
- //printf("%d %d\n",dis[1],dis[2]);
- for(i=1;i<=cnt;i++)
- if(mi>dis[i]) {
- mi=dis[i];
- temp=i;
- }
- // printf("%d\n",mi);
- return temp;
- }
- int main() {
- int m,i,j;
- while(scanf("%d%d",&n,&m),n||m) {
- init();
- while(m--){
- scanf("%d%d",&i,&j);
- addedge(i,j);
- addedge(j,i);
- }
- tarjan(1,-1);
- memset(head,-1,sizeof(head));
- for(i=0;i<yong;i++) {
- int u=bian[i].u,v=bian[i].v;
- if(suo[u]!=suo[v]) {
- addedgetwo(suo[u],suo[v],-1);
- addedgetwo(suo[v],suo[u],-1);
- }
- }
- printf("%d\n",cnt+dis[bfs(bfs(1))]-1);
- }
- return 0;
- }
hdu 4612 双联通缩点+树形dp的更多相关文章
- hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...
- hdu 2242双联通分量+树形dp
/*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...
- 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...
- poj 3694双联通缩点+LCA
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
- Codeforces 1000 组合数可行线段倒dp 边双联通缩点求树直径
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std ...
- HDU 2242 连通分量缩点+树形dp
题目大意是: 所有点在一个连通图上,希望去掉一条边得到两个连通图,且两个图上所有点的权值的差最小,如果没有割边,则输出impossible 这道题需要先利用tarjan算法将在同一连通分量中的点缩成一 ...
- HDU 1520.Anniversary party 基础的树形dp
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 3586 Information Disturbing(二分+树形dp)
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...
随机推荐
- B1076 [SCOI2008]奖励关 状压dp&&期望dp
这个题的n<15,一看就是状压dp.但是状态不是很好想.f[][]存i关的状态j. 这个题另一个关键思想在于倒推,我一开始想的是正推,但是只能记忆化了. 题干: 题目描述 你正在玩你最喜欢的电子 ...
- B1789 Y型项链 贪心
想明白之后就是一道大水题,就是两两把最长公共前缀求出来,然后直接取最长的,然后就直接暴力算就行了... 题干: Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在 ...
- 简述RTMPDump与编译移植
RTMPDump主页 ,RTMPDump库主要包含三部分: 1.一个基本的客户端程序 2.两个服务器程序(rtmpsrv.rtmpsuck) 3.一个支持rtmp协议的库—librtmp 下载RTMP ...
- javascript从作用域链的角度看闭包
闭包 闭包是一个能访问外部函数定义的变量的函数. 为什么? 当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不再存在父作用域了,这就是作用 ...
- HBase编程 API入门系列之get(客户端而言)(2)
心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面是基础,如下 HBase编程 API入门系列之put(客户端而言)(1) package zhouls.bigdata.Hba ...
- SQLServer2008 在where条件中使用CASE WHEN
create table #temp( id int identity(1,1), name varchar(20), startYear int, startMonth in ...
- rabbit channel参数
channel.exchangeDeclare() channel.ExchangeDeclare(string exchange: "cjlTest",string type: ...
- Android开机图片替换
Android开机图片替换 Android从启动到进入Launcher一共会展示三张图片,如果只是更换静态图则更换这三张图片即可,要想换成动画那就要另外操作. 首先查找这个文件: /bootab ...
- 数据库操作(一)DML
1.数据库 数据库可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增.查询.更新.删除等操作. 所谓“数据库”是以一定方式储存在一起.能与多个用户共享.具有尽可能小的冗余度.与 ...
- Python—字符串+变量
字符串转义字符格式化内建函数(后延)转义字符用一个特殊的方法表示出一系列不方便写出的内容,比如回车键,换行键,退格键借助反斜杠字符,一旦字符串中出现反斜杠,则反斜杠后面一个火几个字符表示已经不是原来的 ...