题意:在连通图中,求一条边使得加入这条边以后的消除的桥尽量多。

在同一个边双连通分量内加边肯定不会消除桥的,

求边双连通分量以后缩点,把桥当成边,实际上是要选一条最长的链。

缩点以后会形成一颗树,一定不存在环否则和桥的定义矛盾,求树上的最远点对。

树上的最远点对用dp TLE了,实际上两次dfs就行了,第一次随便选一个点dfs找到最远的点,

再从那个点dfs找最远的点就是树上的最远点对,为什么这样是对的呢?反向来构造,假设已经找了最长的链,

往链上某点上添加一条链,这条链的长度一定小于这个点到两个端点之中距离的最小的那个,

因此无论从哪个点出发dfs,一定会到达最长的链的一个端点。第二遍就一定能找到最长的链。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+, maxm = 2e5+;
int head[maxn],nxt[maxm],to[maxm],ecnt; void addEdge(int u,int v)
{
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
} int pre[maxn],low[maxn],dfs_clock;
bool cut[maxm]; void tarjan(int u,int fa)
{
pre[u] = low[u] = ++dfs_clock;
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
if(!pre[v]){
tarjan(v,i);
low[u] = min(low[u],low[v]);
if(low[v] > pre[u]){
//if(fa<0) cut[i] = cut[i^1] = ~nxt[head[u]];
//else
cut[i] = cut[i^] = true;
}
}else if( (i^)!=fa && pre[v] < pre[u]){
low[u] = min(pre[v],low[u]);
}
}
} int eccno[maxn],ecc_cnt;
int pid[maxn];
void dfs(int u)
{
eccno[u] = ecc_cnt;
for(int i = head[u]; ~i; i = nxt[i] ) if(!cut[i]){
if(!eccno[to[i]]) dfs(to[i]);
}
} vector<int> G[maxn];
#define PB push_back
int deg[maxn]; void find_ecc(int n)
{
dfs_clock = ;
tarjan(,-);
ecc_cnt = ;
for(int i = ; i < n; i++){
if(!eccno[i]){
ecc_cnt++;
pid[ecc_cnt] = i;
dfs(i);
}
} for(int i = ; i <= ecc_cnt; i++) G[i].clear();
memset(deg,,sizeof(deg));
for(int i = ; i < ecnt; i+=){
if(cut[i]){
int u = eccno[to[i]], v = eccno[to[i^]];
G[u].PB(v); G[v].PB(u);
deg[u]++; deg[v]++;
}
}
} void init()
{
memset(head,-,sizeof(head));
ecnt = ;
} int MaxD,poi; void dfs(int u,int fa,int d)
{
if(d > MaxD){
MaxD = d;
poi = u;
}
for(int i = ; i <(int)G[u].size(); i++){
int v = G[u][i]; if(v == fa) continue;
dfs(v,u,d+);
}
} void solve()
{
MaxD = ; poi = ;
dfs(,-,);
int u = poi;
MaxD = ; poi = u;
dfs(u,-,);
int v = poi;
printf("%d %d\n",pid[u]+,pid[v]+);
} int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,m;scanf("%d%d",&n,&m);
init();
for(int i = ; i < m; i++){
int u,v; scanf("%d%d",&u,&v); u--;v--;
addEdge(u,v); addEdge(v,u);
}
find_ecc(n);
solve();
return ;
}

2012-2013 ACM-ICPC, NEERC, Central Subregional Contest J Computer Network1 (缩点+最远点对)的更多相关文章

  1. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  2. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  3. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  4. Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结

    第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...

  5. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  6. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    A. Find a Number 找到一个树,可以被d整除,且数字和为s 记忆化搜索 static class S{ int mod,s; String str; public S(int mod, ...

  7. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  8. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) Solution

    A. Find a Number Solved By 2017212212083 题意:$找一个最小的n使得n % d == 0 并且 n 的每一位数字加起来之和为s$ 思路: 定义一个二元组$< ...

  9. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest H Milestones1 (暴力)

    预处理+暴力,每个颜色都是独立的,求个前缀和,减一减判断一个在区间内颜色是否存在. 算了算复杂度好像有点勉强,但是还是过了,学了主席树以后用主席树在做一下 #include<bits/stdc+ ...

随机推荐

  1. Linux下使用doxygen+vim生成c语言源程序文档的方法

    1.安装 doxygen 有两种获得 doxygen 的方法.可以下载预编译的可执行文件,也可以从 SVN 存储库下载源代码并自己编译.清单 1 演示的是后一种方法. 清单 1. 安装和构建 doxy ...

  2. python反编译之字节码

    如果你曾经写过或者用过 Python,你可能已经习惯了看到 Python 源代码文件:它们的名称以.Py 结尾.你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python "字 ...

  3. 最优化理论-Simplex线性规划

     Sorry,各位,现在这里面啥也没,之所以开这篇文章,是防止以后用得到:现在研究这些,总感觉有些不合适,本人还不到那个层次:如果之后有机会继续研究simplex-线性规划问题,再回来参考下面的链接进 ...

  4. 剑指Offer的学习笔记(C#篇)-- 构建乘积数组

    题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...

  5. php网页上一页下一页翻页

    这几天做项目因为数据太多,需要对信息进行上下翻页展示,就自己写了翻页的代码 大致功能就是页面只显示几条信息,按上一页.下一页切换内容,当显示第一页时上一页和首页选项不可选,当页面加载到最后一页时下一页 ...

  6. Beanshell vs JSR223 vs Java JMeter脚本:性能关闭你一直在等待!

    有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能.查看最流行的扩展机制,比较性能并分析哪一个是最好的. 这是乐队之战,JMeter风格. Beanshell V. JSR223 V ...

  7. jQuery实现全选反选功能

    废话不说,直接上代码! <html> <head> <meta http-equiv="Content-Type" content="tex ...

  8. Windows快捷键应用

    键盘上每个键作用 F1--------------辅助 F3--------------搜索 F4--------------地址 F5--------------刷新 F6------------- ...

  9. 单周期cpu设计代码解读

    目录 写在前面 单周期cpu设计代码讲解 概念回顾 Verilog代码讲解 写在前面 欢迎转载,转载请说明出处. 单周期cpu设计代码讲解 概念回顾 一.电子计算机的部件 分为:中央处理器(cpu). ...

  10. opencv作业

    作业下载地址: 链接:http://pan.baidu.com/s/1qYQnbkw 密码:v7y9