感谢Morris提供的帮助
分析: 1. 对于一个“边双连通分量” 一次dfs就可以将其转化成一个强连通分量(规定了优先顺序 , 不是吗)
2. 桥必须是双向的(反证法)
提示: 可以优美的用一个dfs解决输出
//
// main.cpp
// UVa610
//
// Created by Fuxey on 15/10/5.
// Copyright © 2015年 corn.crimsonresearch. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <vector>
#include <deque>
#include <string>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 1e3+1e2;
int n, m , dfs_clock;
vector<int> g[maxn];
int pre[maxn];
int dfs(int u , int fa)
{
int low = pre[u] = ++dfs_clock;
for(int i=0;i<g[u].size();i++)
{
int v = g[u][i] , out = 0;
if(!pre[v])
{
int lowv = dfs(v, u);
low = min(low , lowv);
if(lowv>pre[u])
cout<<u<<" "<<v<<endl<<v<<" "<<u<<endl , out=1;
}
else if(pre[v]<pre[u] && v!=fa)
low = min(low, pre[v]);
else continue;
if(out==0) cout<<u<<" "<<v<<endl;
}
return low;
}
int main(int argc, const char * argv[]) {
int Case = 0;
while(cin>>n>>m && n+m)
{
for(int i=1;i<=n;i++) g[i].clear();
while(m--)
{
int a , b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs_clock = 0;
memset(pre, 0, sizeof(pre));
cout<<++Case<<endl<<endl;
for(int i=1;i<=n;i++) if(!pre[i]) dfs(i, -1);
cout<<"#\n";
}
return 0;
}
QQ:812483101
欢迎任何疑问和探讨
Best regards Fuxey