A 国派出将军 uim,对 B 国进行战略性措施,以解救涂炭的生灵。
B 国有 n n n 个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。
uim 发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为 key road。
uim 为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。
然而,只有一发炮弹(A 国国会不给钱了)。所以,他能轰炸哪一条铁路呢?
第一行 n , m ( 1 ≤ n ≤ 150 n,m\ (1 \leq n\leq 150 n,m (1≤n≤150, 1 ≤ m ≤ 5000 ) 1 \leq m \leq 5000) 1≤m≤5000),分别表示有 n n n 个城市,总共 m m m 条铁路。
以下 m m m 行,每行两个整数 a , b a, b a,b,表示城市 a a a 和城市 b b b 之间有铁路直接连接。
输出有若干行。
每行包含两个数字 a , b a,b a,b,其中 a < b aa<b,表示 ⟨ a , b ⟩ \lang a,b\rang ⟨a,b⟩ 是 key road。
请注意:输出时,所有的数对 ⟨ a , b ⟩ \lang a,b\rang ⟨a,b⟩ 必须按照 a a a 从小到大排序输出;如果 a a a 相同,则根据 b b b 从小到大排序。
6 6
1 2
2 3
2 4
3 5
4 5
5 6
1 2
5 6
a
,删掉跟它连接的b
点之间的路,如果这俩不能连通了,就算是答案。a, b
间的最短路,如果不存在了,说明不连通了。a
始终比b
小,如果两点之间有路那么就进行删路寻最短路。
bool compare(int a, int b) {
return a > b; // 按照降序排序
}
#include
#include
#include
#include
#include
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int, int> pii; // 定义一个pair类型,用于存储两个整数
vector<pii> path; // 存储所有的关键路
const int N = 160, M = 5010;
int n, m; // n是城市的数量,m是铁路的数量
int g[N][N], st[N]; // g是邻接矩阵,st用于标记城市是否已经被访问
int dist[N]; // dist[i]表示从起始城市到城市i的最短距离
// 判断移除城市a和城市b之间的铁路后,是否还存在一条从城市a到城市b的路径
bool spfa(int a, int b){
memset(dist, INF, sizeof dist); // 初始化所有城市的距离为无穷大
dist[a] = 0; // 起始城市到自身的距离为0
queue<int> q;
q.push(a); // 将起始城市添加到队列中
st[a] = true; // 标记起始城市已经被访问
while(q.size()){
auto t = q.front(); // 取出队列中的第一个城市
q.pop();
st[t] = false; // 标记该城市已经被访问
for(int i = 1; i <= n; ++i){
// 如果当前正在处理的是城市a和城市b之间的铁路,则跳过
if(i == b && t == a) continue;
// 如果找到了一条到达城市i的更短的路径,则更新dist[i]
if(dist[i] > dist[t] + g[t][i]){
dist[i] = dist[t] + g[t][i];
// 如果城市i还没有被访问过,则将其添加到队列中
if(!st[i]){
q.push(i);
st[i] = true;
}
}
}
}
// 如果城市b无法到达,则返回true,否则返回false
if(dist[b] == INF) return true;
else return false;
}
int main(){
cin >> n >> m; // 读取城市和铁路的数量
memset(g, INF, sizeof g); // 初始化邻接矩阵
while(m--){
int a, b;
scanf("%d%d", &a, &b); // 读取一条铁路的信息
g[a][b] = g[b][a] = 1; // 更新邻接矩阵
}
// 对每一对城市进行检查,如果它们之间的铁路是关键路,则将其添加到path中
for(int i = 1; i <= n; ++i)
for(int j = i + 1; j <= n; ++j)
if(g[i][j] != INF && spfa(i, j)){
path.push_back({i, j});
}
sort(path.begin(), path.end()); // 对path进行排序
// 输出所有的关键路
for(int i = 0; i < path.size(); ++i){
auto t = path[i];
cout << t.first << ' ' << t.second << endl;
}
}