POJ[1515] Street Directions 桥
来源:互联网 发布:www.ubuntu.com 编辑:程序博客网 时间:2024/05/29 08:06
Street Directions
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 1041 Accepted: 539 Special Judge
Description
According to the Automobile Collision Monitor (ACM), most fatal traffic accidents occur on two-way streets. In order to reduce the number of fatalities caused by traffic accidents, the mayor wants to convert as many streets as possible into one-way streets. You have been hired to perform this conversion, so that from each intersection, it is possible for a motorist to drive to all the other intersections following some route.
You will be given a list of streets (all two-way) of the city. Each street connects two intersections, and does not go through an intersection. At most four streets meet at each intersection, and there is at most one street connecting any pair of intersections. It is possible for an intersection to be the end point of only one street. You may assume that it is possible for a motorist to drive from each destination to any other destination when every street is a two-way street.
You will be given a list of streets (all two-way) of the city. Each street connects two intersections, and does not go through an intersection. At most four streets meet at each intersection, and there is at most one street connecting any pair of intersections. It is possible for an intersection to be the end point of only one street. You may assume that it is possible for a motorist to drive from each destination to any other destination when every street is a two-way street.
Input
The input consists of a number of cases. The first line of each case contains two integers n and m. The number of intersections is n (2 <= n <= 1000), and the number of streets is m. The next m lines contain the intersections incident to each of the m streets. The intersections are numbered from 1 to n, and each street is listed once. If the pair i j is present, j i will not be present. End of input is indicated by n = m = 0.
Output
For each case, print the case number (starting from 1) followed by a blank line. Next, print on separate lines each street as the pair i j to indicate that the street has been assigned the direction going from intersection i to intersection j. For a street that cannot be converted into a one-way street, print both i j and j i on two different lines. The list of streets can be printed in any order. Terminate each case with a line containing a single `#' character.
Note: There may be many possible direction assignments satisfying the requirements. Any such assignment is acceptable.
Note: There may be many possible direction assignments satisfying the requirements. Any such assignment is acceptable.
Sample Input
7 101 21 32 43 44 54 65 76 72 53 67 91 21 31 42 43 44 55 65 77 60 0
Sample Output
11 22 43 13 64 35 25 46 46 77 5#21 22 43 14 14 34 55 45 66 77 5#
Source
East Central North America 1998
[Submit] [Go Back] [Status] [Discuss]
Home Page Go Back To top
题意: 把尽量多的无向边定向,使得最终图保持强连通的特性.
桥必须得是双向边, 要不然相邻就不能互达双连通分量就不能互达. 其他边按dfs序(搞成一个环)就行了.
如果某点的dfn==low的话, 说明当前这点之下是双连通分量. 父亲边便一定是桥.
#include<stdio.h>#include<cstring>#include<algorithm>#define clear(a) memset(a, 0, sizeof(a))using namespace std;const int maxn = 100005;int n, m, num(1), idx, cas;int h[maxn], fa[maxn], dfn[maxn], low[maxn];struct edge{int nxt, v, u, mk;}e[maxn * 10];inline void add(int u, int v){e[++num].v = v, e[num].nxt = h[u], e[num].u = u, e[num].mk = -1, h[u] = num;e[++num].v = u, e[num].nxt = h[v], e[num].u = v, e[num].mk = -1, h[v] = num;}void dfs(int u){dfn[u] = low[u] = ++idx;for(int i = h[u]; i; i = e[i].nxt){if(i == (fa[u] ^ 1) || e[i].mk != -1) continue;int v = e[i].v;e[i].mk = 1, e[i ^ 1].mk = 0;if(!dfn[v]){fa[v] = i, dfs(v);low[u] = min(low[u], low[v]);}else low[u] = min(low[u], dfn[v]);}if(dfn[u] == low[u]) e[fa[u]].mk = e[fa[u] ^ 1].mk = 1;}int main(){while(true){num = 1, idx = 0;clear(h), clear(fa), clear(dfn), clear(low);scanf("%d%d", &n, &m);if(!n) break;for(int i = 1; i <= m; ++i){int u, v;scanf("%d%d", &u, &v);add(u, v);}for(int i = 1; i <= n; ++i)if(!dfn[i]) dfs(i);printf("%d\n\n", ++cas);for(int i = 2; i <= num; ++i)if(e[i].mk) printf("%d %d\n", e[i].u, e[i].v);puts("#");}return 0;}
阅读全文
0 0
- POJ[1515] Street Directions 桥
- POJ 1515 Street Directions
- POJ 1515 Street Directions 未完成
- poj 1515 Street Directions(双连通分量)
- POJ -- 1515 Street Directions(双连通求割边)
- POJ 1515 - Street Directions 用tarjan求无向图的桥
- 【POJ】1515 Street Directions 无向图转有向图 边双连通+求桥
- poj 1515 Street Directions(无向图改有向图)
- POJ - 1515 Street Directions(无向图变有向图)
- POJ 1515Street Directions 边双连通分量 + dfs
- UVa610 - Street Directions(桥的问题)
- UVA610 Street Directions
- UVA610 - Street Directions(Tarjan)
- poj1515 Street Directions
- UVA 610 Street Directions
- uva610 Street Directions(无向图桥的应用)
- poj 1515 Street Directions 【tarjan 求割边】【确定无向图边的方向 将其变成有向强连通图】
- (beginer)DFS (桥...边-双连通分量) UVA 610 - Street Directions
- Common Lisp译本笔记4之第五章 函数
- 编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
- 使用JAXP进行DOM解析
- linux系统中apktool和aapt工具的安装和简单使用方法
- nginx搭建反向代理和负载均衡
- POJ[1515] Street Directions 桥
- linux 基础6
- WebApp 和 NativeApp 的世纪之战
- 工作思想
- static关键字
- 获取地址栏指定参数的值
- 使用subversion搭建SVN
- 统计学习方法(一)
- JProfiler