博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF1000E]We Need More Bosses
阅读量:6652 次
发布时间:2019-06-25

本文共 2477 字,大约阅读时间需要 8 分钟。

题目大意:给一张无向图,要求找一对$s$和$t$,使得其路径上的割边是最多的,输出其数量。

题解:把边双缩点以后求树的直径。

卡点:

 

C++ Code:

#include 
#include
#define maxn 300010#define maxm 300010#define ONLINE_JUDGE#define read() R::READ()#include
namespace R { int x; #ifdef ONLINE_JUDGE char *ch, op[1 << 26]; inline void init() { fread(ch = op, 1, 1 << 26, stdin); } inline int READ() { while (isspace(*ch)) ch++; for (x = *ch & 15, ch++; isdigit(*ch); ch++) x = x * 10 + (*ch & 15); return x; } #else char ch; inline int READ() { ch = getchar(); while (isspace(ch)) ch = getchar(); for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15); return x; } #endif}int n, m;inline int min(int a, int b) {return a < b ? a : b;}namespace Tree { int head[maxn], cnt; struct Edge { int to, nxt; } e[maxm << 1]; void add(int a, int b) { e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt; e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt; } int q[maxn], h = 1, t = 0; int d[maxn]; int bfs(int rt) { memset(d, 0, sizeof d); d[q[h = t = 0] = rt] = 1; while (h <= t) { int u = q[h++]; for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (!d[v]) { d[v] = d[u] + 1; q[++t] = v; } } } return q[t]; } int work() { int x = bfs(1), y = bfs(x); return d[y] - 1; }}namespace Graph { int head[maxn], cnt; struct Edge { int from, to, nxt; } e[maxm << 1]; void add(int a, int b) { e[++cnt] = (Edge) {a, b, head[a]}; head[a] = cnt; e[++cnt] = (Edge) {b, a, head[b]}; head[b] = cnt; } int res[maxn], CNT; int DFN[maxn], low[maxn], idx, fa[maxn]; int S[maxn], top; void Tarjan(int u) { DFN[u] = low[u] = ++idx; S[++top] = u; int v; for (int i = head[u]; i; i = e[i].nxt) { v = e[i].to; if (v == fa[u]) continue; if (!DFN[v]) { fa[v] = u; Tarjan(v); low[u] = min(low[u], low[v]); if (low[v] > DFN[u]) { CNT++; do res[v = S[top--]] = CNT; while (v != e[i].to); } } else low[u] = min(low[u], DFN[v]); } } inline void tarjan(int n) { for (int i = 1; i <= n; i++) if (!DFN[i]) Tarjan(i); } inline void init() { for (int i = 1; i <= cnt; i += 2) { if (res[e[i].from] != res[e[i].to]) Tree::add(res[e[i].from], res[e[i].to]); } }}int main() { #ifdef ONLINE_JUDGE R::init(); #endif n = read(), m = read(); for (int i = 1; i <= m; i++) Graph::add(read(), read()); Graph::tarjan(n); Graph::init(); printf("%d\n", Tree::work()); return 0;}

 

转载于:https://www.cnblogs.com/Memory-of-winter/p/9661706.html

你可能感兴趣的文章
单选框input:radio
查看>>
go语言中操作mysql的方法
查看>>
Openwrt 刷机后配置WAN口,安装luci和设置中文、安装挂载USB存储。
查看>>
机器学习中的几个常见概念(持续更新中......)
查看>>
ObjectiveC开发教程--字符串的连接
查看>>
设计模式 之 简单工厂与工厂方法
查看>>
随时更新———个人喜欢的关于模式识别、机器学习、推荐系统、图像特征、深度学习、数值计算、目标跟踪等方面个人主页及博客...
查看>>
理解Java ThreadLocal
查看>>
我打赌!!!这些奇葩好用的搜索网站你都不知道
查看>>
PHP第九课 正則表達式在PHP中的使用
查看>>
Cordova 5 架构学习 Weinre远程调试技术
查看>>
Python操作redis学习系列之(集合)set,redis set详解 (六)
查看>>
spark-streaming问题集锦
查看>>
C++中的头文件和源文件
查看>>
leetcode中,代码怎样调试,创造本地执行环境
查看>>
向场景中加入光照
查看>>
Maven实战(九)——打包的技巧
查看>>
Handling bundles in activities and fragments
查看>>
跨域CORS原理及调用详细演示样例
查看>>
ZXing-core生成二维码和解析
查看>>