(beginer)DFS (桥...边-双连通分量) UVA 610 - Street Directions
2014-02-08 09:54
447 查看
Street Directions |
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.
Input
The input consists of a number of cases. The first line of each case contains two integersn and m. The number of intersections is n (
![](http://uva.onlinejudge.org/external/6/610img1.gif)
), 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
![](http://uva.onlinejudge.org/external/6/610img2.gif)
is present,
![](http://uva.onlinejudge.org/external/6/610img3.gif)
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![](http://uva.onlinejudge.org/external/6/610img2.gif)
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
![](http://uva.onlinejudge.org/external/6/610img2.gif)
and
![](http://uva.onlinejudge.org/external/6/610img3.gif)
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.
Sample Input
7 10 1 2 1 3 2 4 3 4 4 5 4 6 5 7 6 7 2 5 3 6 7 9 1 2 1 3 1 4 2 4 3 4 4 5 5 6 5 7 7 6 0 0
Sample Output
1 1 2 2 4 3 1 3 6 4 3 5 2 5 4 6 4 6 7 7 5 # 2 1 2 2 4 3 1 4 1 4 3 4 5 5 4 5 6 6 7 7 5 #
题意:有很多双向的街道,但是我们想要把尽可能多的街道变成单向的,问要怎么破。
思路:首先我们找出整个图中的桥,因为这些街道一定要是双向的。剩下的街道可以构成若干个边-双连通分量,即每一条边都在至少一个简单环中,那么在剩下的边里面dfs一下,dfs的时候不经过桥,那么dfs走的方向就是我们留下来的方向了,哈哈!!
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<vector> #include<stack> #include<string.h> using namespace std; const int maxn = 1000+10; struct Edge { Edge(int uu,int vv) : u(uu) , v(vv) { } int u; int v; }; bool cmp(const Edge & e1 , const Edge & e2) { if (e1.u==e2.u) return e1.v < e2.v; return e1.u < e2.u; } vector<int> G[maxn]; vector<Edge> ans; int dfs_clock , n , m , pre[maxn]; bool vis[maxn][maxn]; bool is_bridge[maxn][maxn]; void init() { ans.clear(); memset(pre,0,sizeof(pre)); dfs_clock = 0; for (int i = 1 ; i <= n ; ++i) G[i].clear(); } void input() { int u , v; while (m--) { scanf("%d%d",&u,&v); is_bridge[u][v] = is_bridge[v][u] = vis[u][v] = vis[v][u] = false; G[u].push_back(v); G[v].push_back(u); } } int dfs(int u,int fa) { int lowu = pre[u] = ++dfs_clock; for (int i = 0 ; i < G[u].size() ; ++i) { int v = G[u][i]; if (v==fa) continue; if (!pre[v]) { int lowv = dfs(v,u); lowu = min(lowu,lowv); if (lowv > pre[u]) { is_bridge[u][v] = is_bridge[v][u] = true; ans.push_back(Edge(u,v)); ans.push_back(Edge(v,u)); } } else if (lowu > pre[v]) lowu = pre[v]; } return lowu; } void dfs1(int u,int fa) { for (int i = 0 ; i < G[u].size() ; ++i) { int v = G[u][i]; if (is_bridge[u][v] || vis[u][v] || v==fa) continue; vis[u][v] = vis[v][u] = true; ans.push_back(Edge(u,v)); dfs1(v,u); } } void solve() { dfs(1,-1); for (int i = 1 ; i <= n ; ++i) dfs1(i,-1); sort(ans.begin(),ans.end(),cmp); for (int i = 0 ; i < ans.size() ; ++i) printf("%d %d\n",ans[i].u,ans[i].v); } int main() { int k = 0; while (scanf("%d%d",&n,&m),n+m) { ++k; init(); input(); printf("%d\n\n",k); solve(); printf("#\n"); } }
相关文章推荐
- (beginer)DFS (双连通分量) UVA 10765 Doves and bombs
- (beginer)DFS UVA 11396 Claw Decomposition
- (beginer)DFS (2-SAT) UVA 11294 Wedding
- (beginer)DFS (dfs) UVA 10319 Manhattan
- (beginer) DFS (二分图判定) UVA 11080 Place the Guards
- (beginer)DFS (强连通)UVA 11504 Dominos
- UVA - 1103 Ancient Messages dfs+stl
- uva 12253 - Simple Encryption(dfs)
- uva 10422 Knights in FEN(迭代dfs)
- uva 1267 - Network(dfs)
- uva 10317 - Equating Equations(dfs)
- 入门经典-习题7-1,109-uva208消防车-DFS,并查集,打印路径,利用set保存边,字典序,STL⭐⭐⭐⭐⭐复杂度:3
- UVA 10004 Bicoloring【DFS简单二部图判定】
- HDU 1241/UVa572 Oil Deposits(DFS&BFS)
- UVA 10285(DFS)
- IDDFS--UVA - 11212 Editing a Book
- UVA572油田问题(DFS求连通块)
- UVALive 7272 Promotions 超详细题解(拓扑、dfs)
- UVALive - 5135 Mining Your Own Business(双连通分量)
- UVA - 572 Oil Deposits (dfs)