题目链接:http://codeforces.com/gym/100676/attachments

题意:

有 n 个点,m 条边,图中,边强连通分量之间可以直达,即距离为 0 ,找一个点当做首都,其他点到首都的最大距离最小。

参考:http://www.cnblogs.com/ost-xg/p/6395100.html

仔细研究了大佬的思路,很牛逼,但是也有一点细节遗漏了,但是还是能AC,interesting;

分析:

边双连通:条件比点双连通松一点,体现在程序中,就是存在一个子节点能到达的最早祖先在父节点之后(没有等于);这样桥就找到了,然后再去找边双连通分量——dfs,从一个点出发,是桥就不是同一个边双连通分量;

这样就把题目中的边双连通分量找出来了;

然后缩点重新建图ed的边集!!!(遍历每一条边,是桥就加上来,大佬的这里多加了哦)

此时,怎么选首都呢?

其实,现在图已经是一棵树了,遍历每一个点跑最短路是傻逼行为;

先找到树的直径,首都一定在这条直径上,枚举直径上的点,最远的,不过是直径上的两个部分;

 #include <bits/stdc++.h>

 using namespace std;

 const int maxn = ;
const long long inf = 1e15 + ; struct Edge
{
long long u, v, c;
} e[maxn<<];
struct Ed
{
long long v, c;
}; int n, m, low[maxn], pre[maxn], tim, ebcc_cnt, du[maxn];
long long k, len, dis[maxn][];
vector<int> G[maxn];
vector<Ed> ed[maxn];
int isbri[maxn<<];
bool vis[maxn]; void init()
{
ebcc_cnt = tim = ;
for (int i = ; i <= n; i++) G[i].clear();
memset(isbri, , sizeof(isbri));
memset(pre, , sizeof(pre));
memset(du, , sizeof(du));
} void tarjan(int u, int fa)
{
low[u] = pre[u] = ++tim;
for (int i = ; 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^] = true; //标记为桥
}
else if (fa != v)
low[u] = min(low[u], pre[v]);
}
} void dfs(int u)
{
pre[u] = ebcc_cnt;
for (int i = ; 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(, -);
memset(pre, , sizeof(pre));
for (int i = ; i <= n; i++)
{
if (!pre[i])
{
ebcc_cnt++;
dfs(i);
}
}
} void BFS(int s, int ca)
{
memset(vis, , sizeof(vis));
queue<Ed> q;
q.push((Ed)
{
s,
});
vis[s] = ;
while (q.size())
{
Ed tmp = q.front();
q.pop();
dis[tmp.v][ca] = tmp.c;
for (int i = ; i < ed[tmp.v].size(); i++)
{
Ed xx = ed[tmp.v][i];
if (!vis[xx.v])
{
vis[xx.v] = ;
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 = ; 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 = ;
cin >> t; while (t--)
{
cin >> n >> m;
init();
for (int i = ; i <= m; i++)
{
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
e[i<<|].u = u, e[i<<|].v = v, e[i<<|].c = c;
e[i<<].u = v, e[i<<].v = u, e[i<<].c = c;
G[u].push_back(i<<|);
G[v].push_back(i<<);
}
find_ebcc();
int tot = m<<|;
for (int i = ; i <= ebcc_cnt; i++) ed[i].clear();
for (int i = ; i <= tot; i += )
{
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 = -;
dfs_len(, -, );
int st = k;
len = -;
dfs_len(st, -, );
BFS(st, );
BFS(k, );
long long inx = n + , dd = inf;
for (int i = ; i <= n; i++)
{
int pr = pre[i];
if (dis[pr][] + dis[pr][] != len) continue;
long long tmp = max(dis[pr][], dis[pr][]);
if (tmp < dd)
{
inx = i;
dd = tmp;
}
}
printf("%lld %lld\n",inx,dd);
}
return ;
}

ACM Arabella Collegiate Programming Contest 2015 H. Capital City 边连通分量的更多相关文章

  1. ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集

    题目链接:http://codeforces.com/gym/100676/attachments 题意: 给一个字符串,有一些约束条件,两个位置要相同,有一些是问号,求最后有多少种方案回文? 分析: ...

  2. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)

    A(By talker): 题意分析:以a(int) op b(int)形式给出两个整数和操作符, 求两个整数是否存在操作符所给定的关系 ,有则输出true,无则输出false: 思路:由于无时间复杂 ...

  3. gym100676 [小熊骑士限定]2015 ACM Arabella Collegiate Programming Contest

    Kuma Rider久违的第二场训练,这场很水,又在vj的榜单上看到第一场的大哥了,2小时ak,大哥牛啤! A.水 #include<cstdio> #include<iostrea ...

  4. 2015 ACM Arabella Collegiate Programming Contest

    题目链接:https://vjudge.net/contest/154238#overview. ABCDE都是水题. F题,一开始分类讨论,结果似乎写挫了,WA了一发.果断换并查集上,A了. G题, ...

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

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

  6. 2017 ACM Arabella Collegiate Programming Contest(solved 11/13)

    省选考前单挑做点ACM练练细节还是很不错的嘛- 福利:http://codeforces.com/gym/101350 先来放上惨不忍睹的virtual participate成绩(中间跑去食堂吃饭于 ...

  7. 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome Problem Description A string is palindrome if it can be read the same way in either di ...

  8. 容斥 或者 单调栈 hihocoder #1476 : 矩形计数 和 G. Snake Rana 2017 ACM Arabella Collegiate Programming Contest

    先说一个简单的题目(题目大意自己看去,反正中文):hihocoder上的:http://hihocoder.com/problemset/problem/1476 然后因为这个n和m的矩阵范围是100 ...

  9. 脑洞 博弈 E. Competitive Seagulls 2017 ACM Arabella Collegiate Programming Contest

    题目链接:http://codeforces.com/gym/101350/problem/E 题目大意:给你一个长度为n的方格,方格上面都被染色成了白色.每次染色都是选择白色的,假设目前选择的这块白 ...

随机推荐

  1. mgo02_mongodb启动警告处理

    ** WARNING: Access control is not enabled for the database. 原因分析:新版本的MongDB增加了安全性设计,推荐用户创建使用数据库时进行验证 ...

  2. PHP rand 和 mt_rand

    PHP mt_rand() 函数 定义和用法 mt_rand() 使用 Mersenne Twister 算法返回随机整数. 语法 mt_rand(min,max) 说明 如果没有提供可选参数 min ...

  3. STL中的算法

    STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...

  4. java 开发体系参考学习

    https://www.oschina.net/question/2663968_2283797

  5. 未来HTML6出现的10个特性

    网络技术正趋向于发展为一个巨大的移动APP市场,在Web开发的革命浪潮中起着指示性作用,自HTML引入以来,创建可转换,有新意的网络移动应用程序变得So easy,web开发中运用先进技术也很容易处理 ...

  6. 浅谈jrebel

    有个同事提高个jrebel的工具,提起tomcat的热部署方案. jrebel是一款收费的JVM级的热部署工具包. JVM级的热部署也就是说,可以不重启JVM,让修改或添加的类加载到JVM中. 加载器 ...

  7. 性能测试工具LoadRunner21-LR之Controller 常用函数

    1.事务函数: Lr_start_transaction();  //标记事务的开始 Lr_end_transaction();  //标记事务的结束,一般情况下,事务开始与结束联合使用 Lr_get ...

  8. (转)python学习链接

    原文:http://www.cnblogs.com/spykids/category/782491.html http://www.cnblogs.com/alex3714/category/7707 ...

  9. LeetCode 984.不含AAA或BBB的字符串(C++)

    给定两个整数 A 和 B,返回任意字符串 S,要求满足: S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母: 子串 'aaa' 没有出现在 S 中: 子串 'bbb' ...

  10. git 基础教程

    git 提交 全部文件 git add .  git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件.注意 -A 选项后面还有一个 ...