炸铁路
题目描述
因为某国被某红色政权残酷的高压暴力统治。美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵。
该国有n个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。
uim发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为key road。
uim为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。
然而,只有一发炮弹(美国国会不给钱了)。所以,他能轰炸哪一条铁路呢?
输入输出格式
输入格式:
第一行n,m(1<=n<=150, 1<=m<=5000),分别表示有n个城市,总共m条铁路。
以下m行,每行两个整数a, b,表示城市a和城市b之间有铁路直接连接。
输出格式:
输出有若干行。
每行包含两个数字a,b(a<b),表示<a,b>是key road。
请注意:输出时,所有的数对<a,b>必须按照a从小到大排序输出;如果a相同,则根据b从小到大排序。
输入输出样例
输入样例#1: 复制
6 6 1 2 2 3 2 4 3 5 4 5 5 6
输出样例#1: 复制
1 2 5 6
tarjan找桥模板
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<queue> 7 const int N=10005; 8 using namespace std; 9 vector<int>G[N]; 10 int n,m,low[N],dfn[N]; 11 int father[N]; 12 int tim,len; 13 struct Node{ 14 int x,y; 15 }ans[N]; 16 bool cmp(Node p,Node q){ 17 if(p.x==q.x){ 18 return p.y<q.y; 19 } 20 return p.x<q.x; 21 } 22 void Tarjan(int i,int Father){ 23 father[i]=Father; 24 dfn[i]=low[i]=tim++; 25 for(int j=0;j<G[i].size();++j){ 26 int k=G[i][j]; 27 if(dfn[k]==-1){ 28 Tarjan(k,i); 29 low[i]=min(low[i],low[k]); 30 } 31 else if(Father!=k){ 32 low[i]=min(low[i],dfn[k]); 33 } 34 } 35 } 36 int main(){ 37 int a,b; 38 scanf("%d%d",&n,&m); 39 for(int i=1;i<=m;i++){ 40 scanf("%d%d",&a,&b); 41 G[a].push_back(b); 42 G[b].push_back(a); 43 } 44 memset(dfn,-1,sizeof(dfn)); 45 memset(father,0,sizeof(father)); 46 memset(low,-1,sizeof(low)); 47 Tarjan(1,0); 48 for(int i=1;i<=n;++i){ 49 int v=father[i]; 50 if(v>0&&low[i]>dfn[v]){ 51 ans[++len].x=min(v,i); 52 ans[len].y=max(v,i); 53 } 54 } 55 sort(ans+1,ans+1+len,cmp); 56 for(int i=1;i<=len;i++){ 57 printf("%d %d\n",ans[i].x,ans[i].y); 58 } 59 return 0; 60 }