CF732F Tourist Reform(边双联通)
题意
在一张有向图中,设 ri 为从点 i 出发能够到达的点的数量。
定义有向图的“改良值”为 ri 的最小值。
现给出一张无向图,要求给每条边定一个方向,使产生的有向图“改良值”最大。
输出 最大改良值和边的方向。
n,m≤400000
题解
对于无向图的每个“边双连通分量”,一定存在一种定向方法,使其改良值等于其大小
把无向图缩点后,以最大的 e-DCC 为零出度点(终点) BFS 定向
每个 e-DCC 内部 DFS 定向
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;
int const N=;
int head[N],cnt;
int dfn[N],low[N],tot,flag[N*];
int c[N],t[N];
int vis[N];
int n,m,u[N],v[N],w[N],num;
struct edge{
int to,nxt,flag;
}e[N*];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void Tarjan(int u,int from){
dfn[u]=low[u]=++tot;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
Tarjan(v,i);
if(e[i].flag==&&e[i^].flag==)e[i].flag=;
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]){
flag[i]=flag[i^]=;
e[i].flag=e[i^].flag=;
}
}
else if(i!=(from^)){
if(e[i].flag==&&e[i^].flag==)e[i].flag=;
low[u]=min(low[u],dfn[v]);
}
}
}
void bfs(int u,int col){
queue<int> q;
q.push(u);
c[u]=col;
t[col]=;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(c[v]||flag[i])continue;
c[v]=col;
t[col]++;
q.push(v);
}
}
}
void dfs(int u){
vis[u]=;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(vis[v]==){
if(c[u]!=c[v])e[i].flag=;
dfs(v);
}
}
}
int main(){
scanf("%d%d",&n,&m);
cnt=;
for(int i=;i<=m;i++){
scanf("%d%d",&u[i],&v[i]);
add(u[i],v[i]);
add(v[i],u[i]);
}
Tarjan(,);
int maxx=,s;
for(int i=;i<=n;i++){
if(!c[i])bfs(i,++num);
if(t[num]>maxx){
maxx=t[num];
s=num;
}
}
printf("%d\n",maxx);
for(int i=;i<=n;i++){
if(c[u[i]]==c[v[i]])continue;
}
for(int i=;i<=n;i++){
if(!vis[i]&&c[i]==s){
dfs(i);
break;
}
}
for(int i=;i<=cnt;i+=){
if(e[i].flag==)printf("%d %d\n",u[i/],v[i/]);
else printf("%d %d\n",v[i/],u[i/]);
}
return ;
}
CF732F Tourist Reform(边双联通)的更多相关文章
- CF732F Tourist Reform[边双缩点]
题意:给无向图每一条边定向,使得每个点可达点数$R_i$最小值尽可能大,求方案. 条件反射想到二分答案,然后看怎么检验,发现要让所有点$R_i$大于等于某一个值,首先我们关注某些特殊的子图:如果有环的 ...
- CF732 F Tourist Reform——边双连通分量
题目:http://codeforces.com/contest/732/problem/F 首先把边双缩点,边双内部 dfs 一个顺序一定是可以从每个点走到边双内部所有点的,因为它是以环为基本单位: ...
- HDU3394 Railway —— 点双联通分量 + 桥(割边)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 Railway Time Limit: 2000/1000 MS (Java/Others) ...
- 732F Tourist Reform
// CF 732F Tourist Reform // 思路:两遍tarjan // 找强联通分量 #include <bits/stdc++.h> using namespace st ...
- POJ3177 & 求边双联通分量
题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树 ...
- [POJ3177]Redundant Paths(双联通)
在看了春晚小彩旗的E技能(旋转)后就一直在lol……额抽点时间撸一题吧…… Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Tota ...
- hdu 3849 (双联通求桥)
一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...
- hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
随机推荐
- 51nod 1632 B君的连通
题目: 这题看起来难,其实这么多概率啥的都是唬人的.甚至连快速幂都不用就可以解. 解法: n个节点,n-1条边,期望会有一半的边被炸毁(因为总体概率就是50%). 即(n-1)/2条边被炸毁,这 ...
- 1806最大数 string和sort函数用法
1.C++自带sort函数用法 sort函数有三个参数: (1)第一个是要排序的数组的起始地址 (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小 ...
- 【原创】JAVA word转html
import java.io.File; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; impor ...
- 【原创】TimeSten安装与配置
1.安装TimeSten 2.安装时要指定TNS_ADMIN_LOCATION,即tnsnames.ora的路径,因为tt会根据这个连接Oracle.C:\TimesTen\tt1122_32\net ...
- 74HC164应用
管脚定义与内部逻辑图 注:管脚一般A.B连在一起作为一个输入:CLR硬件接VDD. 原理如下:每8个CLK上升沿,bit分别从QA移至QH,所以给定一个字节,左移后送入至A/B,这样Bit7经过8个上 ...
- HDU 1166 敌兵布阵【线段树 单点更新】
题意:给出n个数,a1,a2,a3,,,,,an,再给出一些操作 add i j 表示给第i个节点增加j sub i j 表示给第i个节点减少j query i j 表示询问第i个节点到第j个节点 ...
- pthread_cleanup_push vs Autorelease VS 异常处理
黑幕背后的Autorelease http://www.cnblogs.com/feng9exe/p/7239552.html objc_autoreleasePoolPush的返回值正是这个哨兵对象 ...
- 2017-2-10 bash基础脚本
练习:写一脚本,实现如下功能: 1.让用户通过键盘输入一个用户名,如果用户不存在就退出: 2.如果其UID等于其GID,就说它是个"good guy" 3.否则,就说它是个“bad ...
- NodeJS学习笔记 (5)网络服务-http-req(ok)
原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: 概览 本文的重点会放在req这个对象上.前面已经提到,它其实是http.Incom ...
- NOIp2018模拟赛三十六
好久没打模拟赛了...今天一样是两道国集,一道bzoj题 成绩:13+0+95=108 A题开始看错题了...导致样例都没看懂,结果xfz提醒我后我理解了一个我自认为正确的题意(事实证明我和xfz都错 ...