题目链接:

http://codeforces.com/gym/100114

Description

The computer network of “Plunder & Flee Inc.” consists of n servers and m two-way communication links. Two servers can communicate either through a direct link, or through a chain of links, by relaying information from server to server. Current network setup enables communication for any pair of servers. The network administrator strives to maximize network reliability. Some communication links in the network were identified as critical. A failure on any critical link will split the network into disconnected segments. Company management responded to the administrator’s concerns and agreed to fund another communication link, provided that when the new link goes online the number of critical links will be minimized. Write a program that, given a network configuration, will pick a pair of servers to be connected by the new communication link. If several such pairs allow minimizing the number of critical links then any of them will be considered as a correct answer. Example. The following figure presents a network consisting of 7 servers and 7 communication links. Essential links are shown as bold lines. A new link connecting servers #1 and #7 (dotted line) can reduce the number of the critical links to only one

Input

The first line contains two space-delimited integer numbers n (the number of servers) and m (the number of communication links). The following m lines describe the communication links. Each line contains two space-delimited integers xi and yi, which define the IDs of servers connected by link number i. Servers are identified with natural numbers ranging from 1 to n.

Output

The output file should contain a single line with space-delimited integers x and y, the IDs of servers to be connected by the new link..

Sample Input

7 7 1 2 2 3 2 4 2 6 3 4 4 5 6 7

Sample Output

1 7

HINT

1 ≤ n ≤ 10 000; 1≤ m ≤ 100 000; 1 ≤ xi, yi ≤ n; xi ≠ yi.
 

题意:

给你一个无相图,加一条边,使得桥的个数最小化。

题解:

对原图缩点得到一颗树,求树的直径,把直径两端点连起来。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std; const int maxn = + ; struct Edge {
int u,v,type;
Edge(int u,int v,int type=) : u(u),v(v),type(type) {}
}; vector<int> G[maxn];
vector<Edge> egs;
int n, m; void addEdge(int u, int v) {
egs.push_back(Edge(u,v));
G[u].push_back(egs.size() - );
} int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
stack<int> S; //无相图的边双联通分量 tarjan
void dfs(int u) {
pre[u] = lowlink[u] = ++dfs_clock;
S.push(u);
for (int i = ; i < G[u].size(); i++){
Edge& e = egs[G[u][i]];
if (e.type == ) continue;
egs[G[u][i] ^ ].type ^= ;//针对无相图,要标记反向边
if (!pre[e.v]) {
dfs(e.v);
lowlink[u] = min(lowlink[u], lowlink[e.v]);
}
else if (!sccno[e.v]) {
lowlink[u] = min(lowlink[u],pre[e.v]);
}
}
if (lowlink[u] == pre[u]) {
scc_cnt++;
for (;;) {
int x = S.top(); S.pop();
sccno[x] = scc_cnt;
if (x == u) break;
}
}
} void find_scc() {
dfs_clock = scc_cnt = ;
memset(sccno, , sizeof(sccno));
memset(pre, , sizeof(pre));
for (int i = ; i < n; i++) if (!pre[i]) dfs(i);
} vector<int> T[maxn];
//缩点得到的桥构成的树
void build_tree() {
for (int i = ; i < egs.size(); i++) {
Edge& e = egs[i];
if (e.type) continue;
if (sccno[e.u] != sccno[e.v]) {
T[sccno[e.u]].push_back(sccno[e.v]);
T[sccno[e.v]].push_back(sccno[e.u]);
}
}
//for (int i = 1; i <= scc_cnt; i++) {
// printf("%d:", i);
// for (int j = 0; j < T[i].size(); j++) {
// int v = T[i][j];
// printf("%d ", v);
// }
// printf("\n");
//}
} //求树的直径
void dfs2(int u,int fa,int d,int &dep,int &res) {
if (dep < d) dep = d, res = u;
for (int i = ; i < T[u].size(); i++) {
int v = T[u][i];
if (v == fa) continue;
dfs2(v, u, d + , dep, res);
}
} void init() {
for (int i = ; i < n; i++) G[i].clear(), T[i].clear();
T[n].clear();
} int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
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_scc();
build_tree();
int u, v, dep;
dep=-,dfs2(, -, , dep, u);
dep=-,dfs2(u, -, , dep, v);
int au, av;
for (int i = ; i < n; i++) {
//printf("sccno[%d]:%d\n", i,sccno[i]);
if (sccno[i] == u) au = i + ;
if (sccno[i] == v) av = i + ;
}
printf("%d %d\n", au, av);
return ;
}

codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径的更多相关文章

  1. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

  2. Codeforces Gym 100114 J. Computer Network

    Description 给出一个图,求添加一条边使得添加后的图的桥(割边)最少. Sol Tarjan. 一遍Tarjan求割边. 我们发现连接的两个点一定是这两个点之间的路径上的桥最多,然后就可以贪 ...

  3. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  4. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  5. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  6. Codeforces Gym 100114 H. Milestones 离线树状数组

    H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...

  7. Codeforces GYM 100114 B. Island 水题

    B. Island Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description O ...

  8. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  9. Codeforces GYM 100114 C. Sequence 打表

    C. Sequence Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description ...

随机推荐

  1. Java Executors(线程池)

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

  2. 7款HTML5的精美应用教程让你立即爱上HTML5

    1,HTML5/jQuery雷达动画图表图表配置十分简单 分享一款很特别的HTML5图表,它是利用HTML5和jQuery的雷达动画图表,图表数据在初始化的时候带有一定动画. 在线演示 源码下载 2, ...

  3. java中Map,List与Set的区别

    Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类 ...

  4. ASP.NET MVC强制返回XML

    GlobalConfiguration.Configuration.Formatters.Remove(config.Formatters.JsonFormatter);

  5. TCP通信三次握手的过程

    过程 编辑 第一次 第一次握手:建立连接时,客户端 发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...

  6. const关键字在C和C++区别

    1)C++默认为内部链接:C默认为外部链接2)在C++中,一般一个const不会创建内存空间,而是将其保存在符号表(待看).比如: ; char buf[bufsize]; 这里无需为const创建内 ...

  7. 《使用shell位置变量进行目录文件的备份小脚本》

    今天才发现原来位置变量也可以玩的这么爽!! 这是使用位置变量进行文件目录备份:#!/bin/bashDATE=`date +%F`  //日期以年月日输出tar czf $1.$DATE.tar.gz ...

  8. (一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习

    ThinkPHP作为国内具有代表性的PHP框架,经过多年的发展,受到越来越多公司与开发者的青睐.我也在忙里偷闲中抽出部分时间,来学习这个优秀的框架.在开始学习这个框架时,最好通过实例来学习,更容易结合 ...

  9. 使用 PHP 验证表单数据

    使用 PHP 验证表单数据 首先我们对用户所有提交的数据都通过 PHP 的 htmlspecialchars() 函数处理. 当我们使用 htmlspecialchars() 函数时,在用户尝试提交以 ...

  10. php实现图片加密解密,支持加盐

    一个简单的图片加解密函数 使用client跑,不要使用浏览器跑 qq845875470 ,技术交流 <?php /** * Created by hello. * User: qq 845875 ...