POJ 1515 Street Directions
题意:
一幅无向图 将尽量多的无向边定向成有向边 使得图强连通 无向图保证是连通的且没有重边
思路:
桥必须是双向的 因此先求边双连通分量 并将桥保存在ans中
每一个双连通分量内的边一定都能够变成有向边(毕竟是圈组成的图) 边的定向方式分两种:
1、对于树枝边u->v 假设low[v]>dfn[u]说明v回不到u上面去 所以ans应该是v->u的边 否则是u->v
2、对于逆向边 应该全在ans中 由于对于dfs树而言 这样的边利于low减小
代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long LL;
#define N 1010
#define M 2000010
#define inf 2147483647 int n,m,t=1,tot,idx;
int head[N],dfn[N],low[N];
struct edge
{
int u,v,next;
bool vis,cut,left;
}ed[M]; void add(int u,int v)
{
ed[tot].u=u;
ed[tot].v=v;
ed[tot].next=head[u];
ed[tot].vis=ed[tot].cut=ed[tot].left=false;
head[u]=tot++;
} void tarjan(int u)
{
int i,v;
dfn[u]=low[u]=++idx;
for(i=head[u];~i;i=ed[i].next)
{
v=ed[i].v;
if(ed[i].vis) continue;
ed[i].vis=ed[i^1].vis=true;
if(dfn[v]==-1)
{
tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
{
ed[i].cut=ed[i^1].cut=true;
ed[i].left=ed[i^1].left=true;
}
}
else low[u]=min(low[u],dfn[v]);
}
} void dfs(int u)
{
int i,v;
dfn[u]=low[u]=++idx;
for(i=head[u];~i;i=ed[i].next)
{
if(ed[i].cut) continue;
v=ed[i].v;
if(dfn[v]==-1)
{
ed[i].vis=ed[i^1].vis=true;
dfs(v);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) ed[i^1].left=true;
else ed[i].left=true;
}
else
{
low[u]=min(low[u],dfn[v]);
if(!ed[i].vis) ed[i].left=true;
ed[i].vis=ed[i^1].vis=true;
}
}
} void solve()
{
int i;
memset(dfn,-1,sizeof(dfn));
idx=0;
tarjan(1);
memset(dfn,-1,sizeof(dfn));
idx=0;
for(i=0;i<tot;i++) ed[i].vis=false;
for(i=1;i<=n;i++)
{
if(dfn[i]==-1) dfs(i);
}
} int main()
{
int i,u,v;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
tot=0;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
solve();
printf("%d\n\n",t++);
for(i=0;i<tot;i++)
{
if(ed[i].left) printf("%d %d\n",ed[i].u,ed[i].v);
}
printf("#\n");
}
return 0;
}
POJ 1515 Street Directions的更多相关文章
- POJ 1515 Street Directions --一道连通题的双连通和强连通两种解法
题意:将一个无向图中的双向边改成单向边使图强连通,问最多能改多少条边,输出改造后的图. 分析: 1.双连通做法: 双连通图转强连通图的算法:对双连通图进行dfs,在搜索的过程中就能按照搜索的方向给所有 ...
- POJ 1515 Street Directions (边双连通)
<题目链接> 题目大意: 有m条无向边,现在把一些边改成有向边,使得所有的点还可以互相到达.输出改变后的图的所有边(无向边当成双向的有向边输出). 解题分析: 因为修改边后,所有点仍然需要 ...
- UVA 610 - Street Directions(割边)
UVA 610 - Street Directions option=com_onlinejudge&Itemid=8&page=show_problem&category=5 ...
- UVALive 5412 Street Directions
Street Directions Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. ...
- POJ 1320 Street Numbers 【佩尔方程】
任意门:http://poj.org/problem?id=1320 Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- poj 1515+poj 1438(边双连通)
题目链接:http://poj.org/problem?id=1515 思路:题目的意思是说将一个无向图改成有向图,使其成为强连通,输出所有的边.我们可以求无向图的边双连通分量,对于同一个双连通分量, ...
- POJ 1320 Street Numbers 解佩尔方程
传送门 Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2529 Accepted: 140 ...
- POJ 1320 Street Numbers(佩尔方程)
Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3078 Accepted: 1725 De ...
- POJ 1320 Street Numbers Pell方程
http://poj.org/problem?id=1320 题意很简单,有序列 1,2,3...(a-1),a,(a+1)...b 要使以a为分界的 前缀和 和 后缀和 相等 求a,b 因为序列很 ...
随机推荐
- python处理中文字符
1.在py文件中使用中文字符 unicode.py文件内容如下所示: # -*- coding:utf-8 -*- str_ch = '我们women' uni_ch = u'我们women' pri ...
- address_space 从哪里来
address_space 从哪里来 这两天想弄清楚linux的内存分配,忽然看到了address_space,就想弄明白. 整个内核就见到 address_space(1)和address_spac ...
- virus.win32.parite.H病毒的查杀方法
virus.win32.parite.H病毒的查杀方法 昨天电脑中了virus.win32.parite.H病毒,搞了2个多小时最终搞定了.以下记录下我的解决方法. 第一步:下载Win32.Parit ...
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...
- Centos 7 学习之静态IP设置
原文链接:http://blog.csdn.net/johnnycode/article/details/40624403 本学习主要针对 Centos 7.0.1406 版本进行学习整理! 如果你使 ...
- 在WPF的WebBrowser控件中抑制脚本错误
原文:在WPF的WebBrowser控件中抑制脚本错误 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在 ...
- [Windows Phone]AnimationHelper管理分散的Storyboard
问题描述: 在Windows Phone开发时候,可能存在这样的问题: 某一个控件需要一个特定的展现(这里假定是一个特定动画),那么我们会这么解决这个问题呢? 打开Blend,根据需求需求给控件添加动 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- 11.4.2 排序或合并文件(sort命令) - 51CTO.COM
11.4.2 排序或合并文件(sort命令) - 51CTO.COM 11.4.2 排序或合并文件(sort命令) 2010-03-12 14:37 陆松年 电子工业出版社 我要评论(0) 字号:T ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...