codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径
题目链接:
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
Output
Sample Input
7 7 1 2 2 3 2 4 2 6 3 4 4 5 6 7
Sample Output
HINT
题意:
题解:
代码:
#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 无相图缩点+树的直径的更多相关文章
- codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点
J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...
- Codeforces Gym 100114 J. Computer Network
Description 给出一个图,求添加一条边使得添加后的图的桥(割边)最少. Sol Tarjan. 一遍Tarjan求割边. 我们发现连接的两个点一定是这两个点之间的路径上的桥最多,然后就可以贪 ...
- 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 ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- Codeforces Gym 100114 H. Milestones 离线树状数组
H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...
- Codeforces GYM 100114 B. Island 水题
B. Island Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description O ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- Codeforces GYM 100114 C. Sequence 打表
C. Sequence Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description ...
随机推荐
- 如何用C#代码查找某个路径下是否包含某个文件
string path = "f:\\哈哈"; if (Directory.Exists(path)) { MessageBox.Show("存在文件夹") ...
- 分栏控制器和导航栏目tabBarItem,UINavigationController
//// AppDelegate.m// TabBarControllerDemo//// Created by qianfeng on 15/9/22.// Copyright (c) 20 ...
- 【学习笔记】【C语言】逻辑运算符
有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码.这种情况下,我们就要借助于C语言提 ...
- Movie importing requires quicktime
在Unity中使用MovieTexture播放视频会碰到movie importing requires quicktime的错误,解决方法如下: 1.关闭Unity安装QuickTime播放器,打开 ...
- Codevs 1380 没有上司的舞会
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就 ...
- c++11:iota
iota: Fills the range [first, last) with sequentially(循环的) increasing values, starting with value an ...
- 转:JAVA中this用法小结
转:http://blog.sina.com.cn/s/blog_6a6badc90100t8hm.html#SinaEditor_Temp_FontName Java关键字this只能用于方法方法体 ...
- jquery数组之存放checkbox全选值示例代码
使用jquery数组可以存放checkbox全选值,下面有个不错的示例,感兴趣的朋友可以参考下. 复制代码代码如下: <input type="checkbox" id=&q ...
- 关于SQLite的创建以及使用相关说明
关于SQLite的创建以及使用相关说明 没有给出具体的程序,但看完这后可能对你有所帮助. 数据库操作基本知识: execSQL(String sql): 执行一个数据库语句 insert(table, ...
- Requests库的几种请求 - 通过API操作Github
本文内容来源:https://www.dataquest.io/mission/117/working-with-apis 本文的数据来源:https://en.wikipedia.org/wiki/ ...