<题目链接>

题目大意:

有m条无向边,现在把一些边改成有向边,使得所有的点还可以互相到达。输出改变后的图的所有边(无向边当成双向的有向边输出)。

解题分析:

因为修改边后,所有点仍然需要相互可达,所以原无向图中所有的割边仍然只能是双向边,而对于双连通分量中的边,可以将其中的一些边删除。不难想到,在保证图中所有点仍然相互可达的情况下,当将其删成强连通分量的方案是最优的。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; const int N = , M = N * N; struct Edge {
int from, to, nxt,cut;
} edge[M]; int dfn[N],low[N],head[N];
int n, m,tot,cnt;
inline void init(){
tot = cnt = ;
memset(dfn, , sizeof dfn);
memset(head, -, sizeof head);
}
inline void add(int u,int v){
edge[cnt]=(Edge){u,v,head[u],};
head[u]=cnt++;
}
void Tarjan(int u, int pre){
dfn[u] = low[u] = ++tot;
for (int i=head[u];~i;i=edge[i].nxt){
int v=edge[i].to;
if (edge[i].cut) continue; //如果这个边已经被标记了(标记为-1也是被标记过),则无需改变之前的标记,因为只需要找到一种可行的标记方案即可
edge[i].cut=;edge[i^].cut=-; //贪心的将一个方向的边标记
if (v == pre) continue;
if (!dfn[v]){
Tarjan(v, u);
low[u] = min(low[u], low[v]);
if (dfn[u] < low[v])edge[i].cut=edge[i^].cut=;
}
else low[u] = min(low[u], dfn[v]);
}
}
inline void Solve(){
for (int i = ; i < cnt; ++i)
if (edge[i].cut==)printf("%d %d\n", edge[i].from, edge[i].to);
printf("#\n");
}
int main(){
int ncase=;
while(~scanf("%d%d",&n,&m),n||m){
printf("%d\n\n",++ncase);
init();
for(int i=;i<=m;i++){
int u,v;scanf("%d%d", &u, &v);
add(u,v);add(v,u);
}
Tarjan(, -);
Solve();
}
}

POJ 1515 Street Directions (边双连通)的更多相关文章

  1. POJ 1515 Street Directions --一道连通题的双连通和强连通两种解法

    题意:将一个无向图中的双向边改成单向边使图强连通,问最多能改多少条边,输出改造后的图. 分析: 1.双连通做法: 双连通图转强连通图的算法:对双连通图进行dfs,在搜索的过程中就能按照搜索的方向给所有 ...

  2. POJ 1515 Street Directions

    题意: 一幅无向图  将尽量多的无向边定向成有向边  使得图强连通  无向图保证是连通的且没有重边 思路: 桥必须是双向的  因此先求边双连通分量  并将桥保存在ans中 每一个双连通分量内的边一定都 ...

  3. POJ 3177 Redundant Paths (边双连通+缩点)

    <题目链接> <转载于 >>>  > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...

  4. poj 2117 Electricity【点双连通求删除点后最多的bcc数】

    Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4727   Accepted: 1561 Descr ...

  5. poj 1523 SPF【点双连通求去掉割点后bcc个数】

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7246   Accepted: 3302 Description C ...

  6. poj 3694 Network 边双连通+LCA

    题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...

  7. poj1515--Street Directions(边的双连通)

    给一个无向图,要求变成强连通的有向图,需要保留哪些边. 边的双连通,对于桥保留两条边,其他的只保留一条边.求双连通的过程中记录保留边. /******************************* ...

  8. poj 3177 Redundant Paths(tarjan边双连通)

    题目链接:http://poj.org/problem?id=3177 题意:求最少加几条边使得没对点都有至少两条路互通. 题解:边双连通顾名思义,可以先求一下连通块显然连通块里的点都是双连通的,然后 ...

  9. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

随机推荐

  1. BZOJ 4030: [HEOI2015]小L的白日梦

    4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 172  Solved: 39[Submit][Statu ...

  2. docker_监控

    目录 Docker 自带的监控子命令 sysdig Weave Scope cAdvisor Prometheus Prometheus 的架构 多维数据模型 Docker 自带的监控子命令 ps d ...

  3. python之路day02--格式化输出、初始编码、运算符

    格式化输出 格式化输出替换字符串.字符串中%占位符,,%%s就是代表百分号,不代表占位符s 字符串 stringd 数字 dight name = input('请输入你的名字:') age = in ...

  4. deepin安装mysql记录

    本文转载自http://www.linuxidc.com/Linux/2016-07/133128.htm sudo apt-get install mysql-server apt-get isnt ...

  5. [USACO10DEC] Treasure Chest

    题目链接 90 Points:智障的区间 DP--设 dp[i][j] 表示区间 [i, j] 能取的最大价值,但我还是 sd 地开了第三维表示先取还是后取的价值. 交上去以为能 A,结果 #2 开心 ...

  6. 编写高质量的Python代码系列(一)之用Pythonic方式来思考

    Python开发者用Pythonic这个形容词来描述具有特定风格的代码.这种风格是大家在使用Python语言进行编程并相互协作的过程中逐渐形成的习惯.那么,如何以改风格完成常见的Python编程工作呢 ...

  7. 【原创】支持同时生成多个main函数 makefile 模板

    背景: 去年做项目的时候,由于有需要编译出多个可执行文件的需求,修改了Makefile使其支持生成多个结果(编译多个含有main函数的文件),但总觉得自己的实现不够完美. 今年又遇到这样需求的时候,可 ...

  8. python之造测试数据-faker(转载)

    在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据. 在手动制造数据的过程中,可能需要花费大量精力和工作量,现在好了,有一 ...

  9. codeblocks1712设置中文

    下载汉化包:百度网盘,密码:7rrz 下载后放到安装目录:D:\Program Files (x86)\CodeBlocks\share\CodeBlocks\locale\zh_CN(根据个人安装目 ...

  10. POJ 2318 TOYS (叉积+二分)

    题目: Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and ...