Codeforces 732F [边双联通分量][tarjan]
/*
不要低头,不要放弃,不要气馁,不要慌张
题意:
给一个无向图。现在要求给这个无向图的边加上方向。
定义f(x)为从x点出发能够到达的点的数目。
使得MIN(f(x))最大。 思路:
先tarjan找边双分量,然后从点数最大的边双分量开始dfs。
就酱。 中午老妈刚给我打电话问感冒没,我说没有,晚上就发烧了 gg
*/ #include<bits/stdc++.h>
#define N 400050
using namespace std;
int ednum;
struct edge{
int nn;
int id;
edge *next;
};
edge edges[N<<];
edge *adj[N];
struct st{
st(){}
st(int a,int b,int c){
s=a;e=b;xu=c;
}
int s,e,xu;
};
vector<st>ans;
inline void addedge(int a,int b,int c){
edge *tmp=&edges[ednum++];
tmp->id=b;
tmp->nn=c;
tmp->next=adj[a];
adj[a]=tmp;
}
int dfn[N],low[N],id[N],s[N],p,num,t,son[N],nnm[N];//dfn记录dfs时间戳
//low代表当前点到达的最小时间戳,id对点进行分组编号.num是时间戳
//s临时存储数据的手工栈,p栈顶元素的位置,son记录儿子因为无向图记录边都是两个边
void tarjan(int pos){
dfn[pos]=low[pos]=++num;
s[++p]=pos;
for(edge *it=adj[pos];it;it=it->next){
if(!dfn[it->id]){
son[pos]=it->id;
tarjan(it->id);
}
if(son[it->id]!=pos){
low[pos]=min(low[pos],low[it->id]);
}
}
if(low[pos]==dfn[pos]){
t++;
int y;
do{
nnm[t]++;
y=s[p--];
id[y]=t;
}while(y!=pos);
}
}
bool vis[N];
bool vvis[N];
void dfs(int pos){
vis[pos]=;
for(edge *it=adj[pos];it;it=it->next){
if(!vis[it->id]){
son[pos]=it->id;
dfs(it->id);
}
if(son[it->id]!=pos&&!vvis[it->nn]){
vvis[it->nn]=;
ans.push_back(st(pos,it->id,it->nn));
}
}
}
bool cmp(st a,st b){
return a.xu<b.xu;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
addedge(a,b,i);
addedge(b,a,i);
}
tarjan();
int pos,nnn=-;
for(int i=;i<=t;i++){
if(nnn<nnm[i]){
pos=i;
nnn=nnm[i];
}
}
printf("%d\n",nnn);
for(int i=;i<=n;i++){
if(id[i]==pos){
memset(vis,,sizeof(vis));
memset(son,,sizeof(son));
dfs(i);
break;
}
}
sort(ans.begin(),ans.end(),cmp);
for(int i=;i<ans.size();i++){
printf("%d %d\n",ans[i].e,ans[i].s);
}
}
Codeforces 732F [边双联通分量][tarjan]的更多相关文章
- 无向图边双联通分量 tarjan 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005 ...
- poj-3177(并查集+双联通分量+Tarjan算法)
题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- 图连通性【tarjan点双连通分量、边双联通分量】【无向图】
根据 李煜东大牛:图连通性若干拓展问题探讨 ppt学习. 有割点不一定有割边,有割边不一定有割点. 理解low[u]的定义很重要. 1.无向图求割点.点双联通分量: 如果对一条边(x,y),如果low ...
- [J]computer network tarjan边双联通分量+树的直径
https://odzkskevi.qnssl.com/b660f16d70db1969261cd8b11235ec99?v=1537580031 [2012-2013 ACM Central Reg ...
- POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)
[题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...
随机推荐
- How to:如何让Installshield显示正确的软件所需空间--网友冰块先生贡献
软件环境: installshield2010 工程类型:installshield project 现象:当转换目录后所需空间显示不正常. 解决办法:在转换目录地方加上一个TARGETDIR重新 ...
- case when 用法
1. case.group by组合用法 首先看看表中的内容 (COUNTRY . POPULATION. SEX) COUNTRY POPULATION SEX 中国 中国 美国 美国 加拿大 ...
- SOAP Webservice和RESTful Webservice
http://blog.sina.com.cn/s/blog_493a845501012566.html REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的 ...
- CLR via C# 3rd - 08 - Methods
Kinds of methods Constructors Type constructors Overload operators Type con ...
- angular使用echarts折线图
echarts是开源的画图工具,在angular框架中引入echarts不能直接使用.需要新建一个directive //echarts基本参数 app.factory('$echartsConfig ...
- ie8兼容
最近在做ie8兼容,把遇到的问题整理了一下 1. margin:0 auto; 无法居中 解决方法:1.换成h4的文档类型 <!DOCTYPE html PUBLIC "-//W3C/ ...
- same story,different day
多亏了这个重感冒,宏伟计划险些又断了. 我是说当然断了一天,但是比起鄙人过往的八千多个日子,喔,虚惊一场. 又看了段lietome,作为不会看眼色的人,这样的美剧太有吸引力了.想象一下,一个八分半美女 ...
- JSTL配置
1.下载jakarta-taglibs-standard-1.1.2.zip(在Weblogic中必须下载1.0版http://jakarta.apache.org/site/downloads/do ...
- java验证码前台技术
//下面是在前台jsp页面不用导工具的情况下制作的验证码的基本代码 $(function(){ //创建验证码 createCode(); jQuery.validator.addMethod( &q ...
- pyside 移动窗口到屏幕中间
由于计算机使用的尺寸不同,一台机器上设置的窗口位置固定参数往往会在另一台机器上表现欠佳 下面给出一个移动窗口到屏幕中心的示例 import sys from PySide import QtGui c ...