博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces732F Tourist Reform(边双连通分量)
阅读量:7187 次
发布时间:2019-06-29

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

题意:

给出一个无向图,要求转变为有向图,使所有点能到达的点数的最小值最大。

要点:

就是一个边双连通分量,不过我没学过,看了一下白书,觉得就是无向图中的强连通分量,但是其中有很多细节有点难推敲,基本思路就是:边双连通分类对应无向图,找出其中内部点数最多的边双连通分量,它的内部所有点都可以到其余点(包括自己),其余的边双连通分量可以指向最大的这个,也就是说其他所有点的能到达点数是所有的点。最后从内部点数最多的边双连通分量中任意一点开始DFS即可。但是这里有个问题,将v->u作为新边是可以的,反之u->v就是错误的,找不到原因,还是多做几道对应题目比较好。

#include
#include
#include
#include
#include
using namespace std;const int maxn = 400005;int low[maxn], pre[maxn];int n, m, num_max, pos_max, pos;typedef pair
ii;vector
g[maxn];ii ans[maxn];stack
st;void tarjan(int u, int fa){ low[u] = pre[u] = ++pos; st.push(u); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i].first; if (v == fa) continue; if (!pre[v]) tarjan(v, u); low[u] = min(low[u], low[v]); } if (low[u] == pre[u])//找到桥,此时栈中存储的点就是边双连通分量中的点 { int v = 0, count = 0; while (v != u) { v = st.top(); st.pop(); count++; } if (count > num_max) { num_max = count; pos_max = u; } }}void dfs(int u){ pre[u] = 0; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i].first; int id = g[u][i].second; if (pre[v]) { ans[id] = ii(v, u);//问题就在这里,这里如果是u->v是错误的,找不到哪里有问题 dfs(v); } else ans[id] = ii(u, v); }}int main(){ int u, v; scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d", &u, &v); g[u].push_back(ii(v, i)); g[v].push_back(ii(u, i)); } tarjan(1, 0); dfs(pos_max); printf("%d\n", num_max); for (int i = 1; i <= m; i++) printf("%d %d\n", ans[i].first, ans[i].second); return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343669.html

你可能感兴趣的文章
Ron's Editor - Ultimate CSV Editor:免费的 CSV 编辑器,支持 UTF-8 字符集
查看>>
绝对定位下的水平居中实现
查看>>
关于 preg_replace_callbank 的学习记录
查看>>
BeautyWe.js 一套专注于微信小程序的开发范式
查看>>
数字签名和数字证书等openssl加密基本术语
查看>>
前端常用CSS小技巧
查看>>
(十二)本地存储及同步
查看>>
我所感兴趣的iOS10新特性
查看>>
玩转音频、视频的利器:FFmpeg
查看>>
一个苏州IT人的5年挨踢经历-------面试篇(之二)
查看>>
redis学习总结1
查看>>
【作业】结对编程纪实
查看>>
内核如何检测SOFT LOCKUP与HARD LOCKUP?
查看>>
二十四种设计模式:享元模式(Flyweight Pattern)
查看>>
316. Remove Duplicate Letters
查看>>
golang实现任务分发处理
查看>>
C# 获取SQL Server所有的数据库名称
查看>>
利用51单片机制作的电子时钟
查看>>
一个简单Java多线程的应用
查看>>
几种常用的Interpolator(插值器)的动画效果
查看>>