1. 程式人生 > 實用技巧 >【UOJ 271】炸鐵路

【UOJ 271】炸鐵路

【題目描述】:

因為某國被某紅色政權殘酷的高壓暴力統治。美國派出將軍uim,對該國進行戰略性措施,以解救塗炭的生靈。

該國有n個城市,這些城市以鐵路相連。任意兩個城市都可以通過鐵路直接或者間接到達。

uim發現有些鐵路被毀壞之後,某兩個城市無法互相通過鐵路到達。這樣的鐵路就被稱為key road。

uim為了儘快使該國的物流系統癱瘓,希炸燬鐵路,已達到存在某兩個城市無法互相通過鐵路到達的效果。

然而,只有一發炮彈(美國國會不給錢了)。所以,他可以在哪些鐵路中選擇一條轟炸呢?

【輸入描述】:

第一行n,m,分別表示有n個城市,總共m條鐵路。

以下m行,每行兩個整數a,b,表示城市a和城市b之間有鐵路直接連線。

【輸出描述】:

輸出有若干行。

每行包含兩個數字a,b(不保證a是key road。

請注意:輸出時,所有的數對必須按照a從小到大排序輸出;如果a相同,則根據b從小到大排序。

【樣例輸入】:

6 6
1 2
2 3
2 4
3 5
4 5
5 6

【樣例輸出】:

1 2
5 6

【時間限制、資料範圍及描述】:

時間:1s 空間:128M

1<=n<=10000, 1<=m<=100000

題解;Tarjan求橋嚶嚶嚶~

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include
<cstring> #include<algorithm> #include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=200003; int dfn[N],low[N],cnt,head[N]; int cTime; struct node{ int to,next; }e[N]; int n,m,x,y,tmp; struct look{ int yao; int chen;//琛琛 }jjj[N]; void add(int x,int y){ e[
++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt; } void tarjan(int u,int fa){ dfn[u]=low[u]=++cTime; bool flag=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa ) { flag=0; continue; } if(!dfn[v]){ tarjan(v,u); low[u]=min(low[u],low[v]); if(low[v]>dfn[u]) { jjj[++tmp].yao=min(v,u); jjj[tmp].chen=max(u,v); } } else low[u]=min(low[u],dfn[v]); } } bool cmp(look xx,look yy){ if(xx.yao==yy.yao) return xx.chen<yy.chen; return xx.yao<yy.yao; } int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d %d",&x,&y); add(x,y); add(y,x); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,0);//cout<<tmp; sort(jjj+1,jjj+1+tmp,cmp); for(int i=1;i<=tmp;i++) printf("%d %d\n",jjj[i].yao,jjj[i].chen); return 0; }