https://www.luogu.org/problem/show?pid=1656
题目描述
因为某国被某红色政权残酷的高压暴力统治。美国派出将军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
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #define maxn 1e6 6 7 using namespace std; 8 9 int n,m,tot,cnt; 10 int x[5005],y[5005]; 11 bool vis[5005]; 12 int map[5005][5005]; 13 struct node 14 { 15 int a,b; 16 }ans[5005]; 17 18 bool cmp(node aa,node bb) 19 { 20 if(aa.a!=bb.a) 21 return aa.a<bb.a; 22 else 23 return aa.b<bb.b; 24 } 25 26 bool DFS(int from) 27 { 28 vis[from]=1; 29 for(int i=1;i<=n;i++) 30 { 31 if(!vis[i]&&(map[from][i]||map[i][from])) 32 { 33 cnt++; 34 DFS(i); 35 } 36 } 37 return cnt==n-1; 38 } 39 40 int main() 41 { 42 scanf("%d%d",&n,&m); 43 for(int i=1;i<=m;i++) 44 { 45 cin>>x[i]>>y[i]; 46 map[x[i]][y[i]]=map[y[i]][x[i]]=1; 47 } 48 49 for(int i=1;i<=m;i++) 50 { 51 cnt=0; 52 memset(vis,0,sizeof(vis)); 53 map[x[i]][y[i]]=map[y[i]][x[i]]=0; 54 if(!DFS(1)) 55 { 56 ans[++tot].a=min(x[i],y[i]); 57 ans[tot].b=max(x[i],y[i]); 58 } 59 map[x[i]][y[i]]=map[y[i]][x[i]]=1; 60 } 61 sort(ans+1,ans+tot+1,cmp); 62 for(int i=1;i<=tot;i++) 63 cout<<ans[i].a<<" "<<ans[i].b<<endl; 64 return 0; 65 }