P1656 炸铁路 洛谷

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 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/6623470.html