ACM Arabella Collegiate Programming Contest 2015 H. Capital City 边连通分量
2017-04-21 16:41
381 查看
题目链接:http://codeforces.com/gym/100676/attachments
View Code
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; const long long inf = 1e15 + 5; struct Edge { long long u, v, c; } e[maxn<<2]; struct Ed { long long v, c; }; int n, m, low[maxn], pre[maxn], tim, ebcc_cnt, du[maxn]; long long k, len, dis[maxn][2]; vector<int> G[maxn]; vector<Ed> ed[maxn]; int isbri[maxn<<4]; bool vis[maxn]; void init() { ebcc_cnt = tim = 0; for (int i = 1; i <= n; i++) G[i].clear(); memset(isbri, 0, sizeof(isbri)); memset(pre, 0, sizeof(pre)); memset(du, 0, sizeof(du)); } void tarjan(int u, int fa) { low[u] = pre[u] = ++tim; for (int i = 0; i < G[u].size(); i++) { int tmp = G[u][i]; int v = e[tmp].v; if (!pre[v]) { tarjan(v, u); low[u] = min(low[u], low[v]); if (low[v] > pre[u]) isbri[tmp] = isbri[tmp^1] = true; //标记为桥 } else if (fa != v) low[u] = min(low[u], pre[v]); } } void dfs(int u) { pre[u] = ebcc_cnt; for (int i = 0; i < G[u].size(); i++) { int tmp = G[u][i]; if (isbri[tmp]) continue; int v = e[tmp].v; if (pre[v]) continue; dfs(v); } } void find_ebcc() { tarjan(1, -1); memset(pre, 0, sizeof(pre)); for (int i = 1; i <= n; i++) { if (!pre[i]) { ebcc_cnt++; dfs(i); } } } void BFS(int s, int ca) { memset(vis, 0, sizeof(vis)); queue<Ed> q; q.push((Ed) { s, 0 }); vis[s] = 1; while (q.size()) { Ed tmp = q.front(); q.pop(); dis[tmp.v][ca] = tmp.c; for (int i = 0; i < ed[tmp.v].size(); i++) { Ed xx = ed[tmp.v][i]; if (!vis[xx.v]) { vis[xx.v] = 1; q.push((Ed) { xx.v, xx.c + tmp.c }); } } } } void dfs_len(int x, int fa, long long dep) { if (dep > len) { k = x; len = dep; } for (int i = 0; i < ed[x].size(); i++) { Ed tmp = ed[x][i]; if (tmp.v == fa) continue; dfs_len(tmp.v, x, dep + tmp.c); } } int main() { int t = 1; cin >> t; while (t--) { cin >> n >> m; init(); for (int i = 1; i <= m; i++) { int u, v, c; scanf("%d%d%d", &u, &v, &c); e[i<<1|1].u = u, e[i<<1|1].v = v, e[i<<1|1].c = c; e[i<<1].u = v, e[i<<1].v = u, e[i<<1].c = c; G[u].push_back(i<<1|1); G[v].push_back(i<<1); } find_ebcc(); int tot = m<<1|1; for (int i = 1; i <= ebcc_cnt; i++) ed[i].clear(); for (int i = 3; i <= tot; i += 2) { if (isbri[i]) { int u = e[i].v, v = e[i].u; ed[pre[u]].push_back((Ed) { pre[v], e[i].c }); ed[pre[v]].push_back((Ed) { pre[u], e[i].c }); } } len = -1; dfs_len(1, -1, 0); int st = k; len = -1; dfs_len(st, -1, 0); BFS(st, 0); BFS(k, 1); long long inx = n + 1, dd = inf; for (int i = 1; i <= n; i++) { int pr = pre[i]; if (dis[pr][0] + dis[pr][1] != len) continue; long long tmp = max(dis[pr][0], dis[pr][1]); if (tmp < dd) { inx = i; dd = tmp; } } printf("%lld %lld\n",inx,dd); } return 0; }
View Code
相关文章推荐
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
- 2015 ACM Arabella Collegiate Programming Contest(F题)
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest
- ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集
- 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)
- 2017 ACM Arabella Collegiate Programming Contest-L. All’s Wall That Ends Wall
- 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) Adjoin the Networks (树的直径)
- 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) Disastrous Downtime(前缀和)
- 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) Goblin Garden Guards (数论)
- 2017 ACM Arabella Collegiate Programming Contest Monkeying Around
- 2015 ACM Amman Collegiate Programming Contest D.Alternating Strings【Dp】
- 【Codeforces】2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) A Adjoin the Netwo
- 2015 ACM Amman Collegiate Programming Contest H.Bridges【边双联通+求树上最长链(树的直径)】
- Codeforces Gym 2015 ACM Amman Collegiate Programming Contest
- 2017 ACM Arabella Collegiate Programming Contest Magical Bamboos
- 2015 ACM Amman Collegiate Programming Contest
- 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest ---E题Entertainment Box(有点变化的贪心)
- 【Codeforces】2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) E 线段树+离散化
- 2017 ACM Arabella Collegiate Programming Contest Snake Rana