CF732F Tourist Reform(边双联通)

题意

在一张有向图中,设 ri 为从点 i 出发能够到达的点的数量。

定义有向图的“改良值”为 ri 的最小值。

现给出一张无向图,要求给每条边定一个方向,使产生的有向图“改良值”最大。

输出 最大改良值和边的方向。

n,m≤400000

题解

对于无向图的每个“边双连通分量”,一定存在一种定向方法,使其改良值等于其大小

把无向图缩点后,以最大的 e-DCC 为零出度点(终点) BFS 定向

每个 e-DCC 内部 DFS 定向

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 #include<cstdio>
  6 #include<queue>
  7 using namespace std;
  8 int const N=400100;
  9 int head[N],cnt;
 10 int dfn[N],low[N],tot,flag[N*2];
 11 int c[N],t[N];
 12 int vis[N];
 13 int n,m,u[N],v[N],w[N],num;
 14 struct edge{
 15     int to,nxt,flag;
 16 }e[N*3];
 17 void add(int u,int v){
 18     cnt++;
 19     e[cnt].nxt=head[u];
 20     e[cnt].to=v;
 21     head[u]=cnt;
 22 }
 23 void Tarjan(int u,int from){
 24     dfn[u]=low[u]=++tot;
 25     for(int i=head[u];i;i=e[i].nxt){
 26         int v=e[i].to;
 27         if(!dfn[v]){
 28             Tarjan(v,i);
 29             if(e[i].flag==0&&e[i^1].flag==0)e[i].flag=1;
 30             low[u]=min(low[u],low[v]);
 31             if(dfn[u]<low[v]){
 32                 flag[i]=flag[i^1]=1;
 33                 e[i].flag=e[i^1].flag=0;
 34             }
 35         }
 36         else if(i!=(from^1)){
 37             if(e[i].flag==0&&e[i^1].flag==0)e[i].flag=1;
 38             low[u]=min(low[u],dfn[v]);
 39         }
 40     }
 41 }
 42 void bfs(int u,int col){
 43     queue<int> q;
 44     q.push(u);
 45     c[u]=col;
 46     t[col]=1;
 47     while(!q.empty()){
 48         int u=q.front();
 49         q.pop();
 50         for(int i=head[u];i;i=e[i].nxt){
 51             int v=e[i].to;
 52             if(c[v]||flag[i])continue;
 53             c[v]=col;
 54             t[col]++;
 55             q.push(v);
 56         }
 57     }
 58 }
 59 void dfs(int u){
 60     vis[u]=1;
 61     for(int i=head[u];i;i=e[i].nxt){
 62         int v=e[i].to;
 63         if(vis[v]==0){
 64             if(c[u]!=c[v])e[i].flag=1;
 65             dfs(v);
 66         }
 67     }
 68 }
 69 int main(){
 70     scanf("%d%d",&n,&m);
 71     cnt=1;
 72     for(int i=1;i<=m;i++){
 73         scanf("%d%d",&u[i],&v[i]);
 74         add(u[i],v[i]);
 75         add(v[i],u[i]);
 76     }
 77     Tarjan(1,0);
 78     int maxx=0,s;
 79     for(int i=1;i<=n;i++){
 80         if(!c[i])bfs(i,++num);
 81         if(t[num]>maxx){
 82             maxx=t[num];
 83             s=num;
 84         }
 85     }
 86     printf("%d\n",maxx);
 87     for(int i=1;i<=n;i++){
 88         if(c[u[i]]==c[v[i]])continue;
 89     }
 90     for(int i=1;i<=n;i++){
 91         if(!vis[i]&&c[i]==s){
 92             dfs(i);
 93             break;
 94         }
 95     }
 96     for(int i=2;i<=cnt;i+=2){
 97         if(e[i].flag==0)printf("%d %d\n",u[i/2],v[i/2]);
 98         else printf("%d %d\n",v[i/2],u[i/2]);
 99     }
100     return 0;
101 } 

原文地址:https://www.cnblogs.com/Xu-daxia/p/9385860.html

时间: 2024-11-09 06:17:56

CF732F Tourist Reform(边双联通)的相关文章

codeforces CF732F Tourist Reform Tarjan边双连通分量

$ \rightarrow $ 戳我进CF原题 一张有向图中,设 $ r_i $ 为从点 $ i $ 出发能够到达的点的数量. 定义有向图的"改良值"为 $ r_i $ 的最小值. 现给出一张无向图,要求给每条边定一个方向,使产生的有向图"改良值"最大. $ n,m \le 400000 $ 对于无向图的每个"边双连通分量",一定存在一种定向方法,使其改良值等于其大小 把无向图缩点后,以最大的 $ e-DCC $ 为零出度点(终点) $ BFS

CF732 F Tourist Reform——边双连通分量

题目:http://codeforces.com/contest/732/problem/F 首先把边双缩点,边双内部 dfs 一个顺序一定是可以从每个点走到边双内部所有点的,因为它是以环为基本单位: 然后对于缩点之后的图,找到 siz 最大的点作为根 dfs,再连反边,那么只有 siz 最大的那个点只能走到自己内部,就可以使答案最大: 结构体要开得精细一点,防止爆空间?还是什么奇奇怪怪的错误之类的... 代码如下: #include<iostream> #include<cstdio&

hihocoder #1190 : 连通性&#183;四 点双联通分量

http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组.这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内

CodeForces 732F Tourist Reform

边双连通分量. 这题有一点构造的味道.一个有向图,经过强连通缩点之后会形成一个有向无环图. 如果将最大的强连通分量放在顶端,其余的强连通分量都直接或间接指向他,那么这样就构造出了符合要求的图. 接下来就是要去寻找强连通分量.对于一个无向图来说,每一个边-双联通分量都可以将每条边定向之后构造成一个强连通分量,$dfs$一遍即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #

[HDOJ4738]Caocao&#39;s Bridges(双联通分量,割边,tarjan)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 给一张无向图,每一条边都有权值.找一条割边,使得删掉这条边双连通分量数量增加,求权值最小那条. 注意有重边,ACEveryDay里群巨给的意见是tarjan的时候记录当前点是从哪条边来的. 注意假如桥的权值是0的时候也得有一个人去炸…… 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7

UVA - 10765 Doves and bombs (双联通分量)

链接 :  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34798 给N个点的无向图并且联通,问删除每次一个点之后还剩多少联通分量. 找割顶 如果删除的是割顶 联通分量就会增加,否则还是1(因为原图是联通图),删除割顶之后 联通块的数目 就要看该割顶在几个双联通分量里出现过. #pragma comment(linker, "/STACK:10240000,10240000") #include <a

POJ 3177 Redundant Paths(边双联通图)

Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often being forc

HDU 4612 Warm up(边双联通求树的直径)

Problem Description N planets are connected by M bidirectional channels that allow instant transportation. It's always possible to travel between any two planets through these channels. If we can isolate some planets from others by breaking only one

【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 11661   Accepted: 3824 Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, an