<题目链接>

题目大意:
给定一个$n$个节点$m$条边的无向图,问你对任意两点,最多有多少条特殊边,特殊边指删除这条边后,这两个点不能够到达。

解题分析:

特殊变其实就是指割边,题意就是问你任意两点的路径之间,割边的最大数量。比较裸的题目,由边双连通和树的直径拼凑而成。

用边双连通缩完点之后,树形DP算出最长链即可。

#include <bits/stdc++.h>
using namespace std;
template<typename T>
inline void read(T&x){
x=;int f=;char ch=getchar();
while(ch<'' ||ch>''){ if(ch=='-')f=-; ch=getchar(); }
while(ch>='' && ch<=''){ x=x*+ch-''; ch=getchar(); }
x*=f;
}
#define pb push_back
#define REP(i,s,t) for(int i=s;i<=t;i++)
#define clr(a,b) memset(a,b,sizeof(a))
const int N = 3e5+;
int n,m,tot,top,bcc;
int head1[N],head2[N],dfn[N],bel[N],cnt1,cnt2;
int low[N],instk[N],stk[N];
vector<int>G[N];
struct Edge{ int from,to,nxt; }e1[N<<],e2[N<<];
int ans;
inline void init(){
REP(i,,n)G[i].clear();
cnt1=cnt2=tot=top=bcc=;
clr(dfn,);clr(bel,);
clr(head1,-);clr(head2,-);
}
inline void add1(int u,int v){
e1[cnt1]=(Edge){u,v,head1[u]};head1[u]=cnt1++;
}
inline void add2(int u,int v){
e2[cnt2]=(Edge){u,v,head2[u]};head2[u]=cnt2++;
}
void Tarjan(int u,int pre){
dfn[u]=low[u]=++tot;
instk[u]=;stk[++top]=u;
bool fp=false;
for(int i=head1[u];~i;i=e1[i].nxt){
int v=e1[i].to;
if(v==pre && !fp){ fp=true;continue; }
if(!dfn[v]){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
}else if(instk[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
++bcc;
while(true){
int v=stk[top--];
instk[v]=;
bel[v]=bcc;
G[bcc].pb(v);
if(u==v)break;
}
}
}
inline void getMap(){
for(int i=;i<cnt1;i++){ //缩点
int u=e1[i].from,v=e1[i].to;
if(bel[u]!=bel[v])add2(bel[u],bel[v]);
}
} int dp1[N],dp2[N];
//树形DP求树的直径
void dfs(int u,int pre){
for(int i=head2[u];~i;i=e2[i].nxt){
int v=e2[i].to;
if(v==pre)continue;
dfs(v,u);
if(dp1[v]+>dp1[u])dp2[u]=dp1[u],dp1[u]=dp1[v]+;
else if(dp1[v]+>dp2[u])dp2[u]=dp1[v]+;
}
ans=max(ans,dp1[u]+dp2[u]);
} int main(){
init();
read(n);read(m);
REP(i,,m){
int u,v;read(u);read(v);
add1(u,v);add1(v,u);
}
Tarjan(,-);
getMap();
dfs(,-); //进行树形DP求最长链
cout<<ans<<endl;
}

Codeforces 1000E We Need More Bosses (边双连通+最长链)的更多相关文章

  1. CodeForces - 1000E We Need More Bosses

    题面在这里! 依然一眼题,求出割边之后把图缩成一棵树,然后直接求最长链就行了2333 #include<bits/stdc++.h> #define ll long long using ...

  2. E - We Need More Bosses CodeForces - 1000E (tarjan缩点,树的直径)

    E - We Need More Bosses CodeForces - 1000E Your friend is developing a computer game. He has already ...

  3. 边双连通缩点+树dp 2015 ACM Arabella Collegiate Programming Contest的Gym - 100676H

    http://codeforces.com/gym/100676/attachments 题目大意: 有n个城市,有m条路,每条路都有边长,如果某几个城市的路能组成一个环,那么在环中的这些城市就有传送 ...

  4. poj 3694 Network 边双连通+LCA

    题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...

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

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

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

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

  7. HDU-4612 Warm up 边双连通分量+缩点+最长链

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 简单图论题,先求图的边双连通分量,注意,此题有重边(admin还逗比的说没有重边),在用targ ...

  8. poj1515--Street Directions(边的双连通)

    给一个无向图,要求变成强连通的有向图,需要保留哪些边. 边的双连通,对于桥保留两条边,其他的只保留一条边.求双连通的过程中记录保留边. /******************************* ...

  9. poj3177--Redundant Paths(边的双连通)

    有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立的路.两条独立的路是指:没有公共边的路,但可以 ...

随机推荐

  1. linux Sersync 参数说明

    Sersync 的可选功能是通过 xml 配置文件来实现的,下面来为大家解释该文件! 在该文件中,使用<!--中间是注释内容-->的方式去注释信息,注意不是我们平时# [root@SERS ...

  2. 转载——CentOS---网络配置详解

    看到一篇关于Centos网络配置很详细的文章,特此复制来.原文网址:http://blog.chinaunix.net/uid-26495963-id-3230810.html 一.配置文件详解在RH ...

  3. Kintex 7五兄弟

    基KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡(136) 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡.由一 ...

  4. UNIX网络编程总结三

    套接口结构 IPv4套接口地址结构: 1 2 3 4 5 6 7 struct sockaddr_in{/*16字节*/ uint8_t sin_len;  /*结构体长度,8位*/ sa_famil ...

  5. 如何判断当前LINUX系统启用了ASLR

    内核参数randomize_va_space用于控制系统级ASLR 0 关闭ASLR 1 mmap base.stack.vdso page将随机化.这意味着.so文件将被加载到随机地址.链接时指定了 ...

  6. Python---编辑器安装和print函数

    Python---编辑器安装和print函数 -------------------------------------------------------- 一.Python是什么? Python是 ...

  7. 两个list 合并后去除掉重复removeAll()的,然后再随机获取最后list中的 几个值

    public static void test1(){ String s1="1,2,5,3,6,9"; String n1[]=s1.split(","); ...

  8. 回归平方和 ESS,残差平方和 RSS,总体平方和 TSS

    https://zhidao.baidu.com/question/565190261749684764.html 回归平方和 ESS,残差平方和 RSS,总体平方和 TSS   总变差       ...

  9. vue项目适应不同屏幕做的适配器

    一般宽度是1920的,但是有的电脑屏幕很窄,导致页面样式错乱,那么可以设置app.vue以及主页面里的样式宽度为1920px,超过了就auto. 如下: (app.vue) (home.vue) 原效 ...

  10. Maven安装本地jar包至本地repository

    1.安装jar包 Maven 安装 JAR 包的命令是:   mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -Dartifa ...