当前位置: 首页 > news >正文

题解:洛谷 P1656 炸铁路

【题目来源】

洛谷:P1656 炸铁路 - 洛谷

【题目描述】

A 国派出将军 uim,对 B 国进行战略性措施,以解救涂炭的生灵。

B 国有 \(n\) 个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。

uim 发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为 key road。

uim 为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。

然而,只有一发炮弹(A 国国会不给钱了)。所以,他能轰炸哪一条铁路呢?

【输入】

第一行 \(n,m\ (1 \leq n\leq 150\)\(1 \leq m \leq 5000)\),分别表示有 \(n\) 个城市,总共 \(m\) 条铁路。

以下 \(m\) 行,每行两个整数 \(a, b\),表示城市 \(a\) 和城市 \(b\) 之间有铁路直接连接。

【输出】

输出有若干行。

每行包含两个数字 \(a,b\),其中 \(a<b\),表示 \(\lang a,b\rang\) 是 key road。

请注意:输出时,所有的数对 \(\lang a,b\rang\) 必须按照 \(a\) 从小到大排序输出;如果 \(a\) 相同,则根据 \(b\) 从小到大排序。

【输入样例】

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

【输出样例】

1 2
5 6

【算法标签】

《洛谷 P1656 炸铁路》 #模拟# #搜索# #图论# #并查集# #最短路# #Tarjan# #洛谷原创#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 155;      // 最大节点数
const int M = 10005;    // 最大边数// 边结构体
struct edge
{int u, v;           // u:起点, v:终点
};// 桥结构体,支持排序
struct bridge
{int x, y;           // 桥的两个端点// 重载小于运算符,用于排序bool operator<(const bridge &t) const {if (x == t.x) return y < t.y;return x < t.x;}
} bri[M];               // 存储所有桥int n, m, a, b, cnt;    // n:节点数, m:边数, cnt:桥的数量
int dfn[N];             // DFS序(时间戳)
int low[N];             // 通过回边能到达的最小DFN值
int tot;                // 时间戳计数器vector<edge> e;         // 存储所有边的数组
vector<int> h[N];       // 邻接表,h[i]存储从节点i出发的边在e中的索引/*** 添加无向边到图中* @param a 边的起点* @param b 边的终点*/
void add(int a, int b)
{e.push_back({a, b});            // 添加边到边数组h[a].push_back(e.size() - 1);   // 记录边在数组中的索引
}/*** Tarjan算法寻找桥* @param x 当前节点* @param in_edg 进入当前节点的边索引(用于避免重复访问)*/
void tarjan(int x, int in_edg)
{// 初始化当前节点的DFN和LOW值dfn[x] = low[x] = ++tot;// 遍历当前节点的所有出边for (int i = 0; i < h[x].size(); i++){int j = h[x][i];            // 当前边在e数组中的索引int y = e[j].v;             // 邻接节点// 如果邻接节点y未被访问(树边)if (!dfn[y]){tarjan(y, j);           // 递归访问ylow[x] = min(low[x], low[y]);  // 更新low值// 桥的判断条件:low[y] > dfn[x]if (low[y] > dfn[x]){// 记录桥(确保x<y,便于排序输出)if (x < y)bri[++cnt] = {x, y};elsebri[++cnt] = {y, x};}}// 如果y已被访问且不是来时的边(回边)else if (j != (in_edg ^ 1)){low[x] = min(low[x], dfn[y]);  // 通过回边更新low值}}
}int main()
{// 输入节点数和边数cin >> n >> m;// 输入所有边并构建无向图while (m--){cin >> a >> b;add(a, b);  // 添加边a->badd(b, a);  // 添加边b->a(无向图需要双向添加)}// 对每个未访问的节点执行Tarjan算法for (int i = 1; i <= n; i++){if (!dfn[i]) {tarjan(i, 0);}}// 对桥进行排序(按起点升序,起点相同按终点升序)sort(bri + 1, bri + cnt + 1);// 输出所有桥for (int i = 1; i <= cnt; i++){cout << bri[i].x << " " << bri[i].y << endl;}return 0;
}

【运行结果】

6 6
1 2
2 3
2 4
3 5
4 5
5 6
1 2
5 6
http://www.jsqmd.com/news/394958/

相关文章:

  • 题解:洛谷 P2863 [USACO06JAN] The Cow Prom S
  • 告别“打字机”:Generative UI 如何重塑 AI 时代的前端交互?
  • DataFrame条件筛选:从入门到实战的数据清洗利器
  • 题解:洛谷 P2700 逐个击破
  • DataFrame数据修改:从基础操作到高效实践的完整指南
  • 深入浅出BlockingQueue(三)
  • 从0学习pwn【第二章】pwngdb调试
  • 题解:洛谷 P1967 [NOIP 2013 提高组] 货车运输
  • 负债上岸不踩坑!口碑好的贷款信用卡个人债务协商公司,渠道+服务全揭秘 - 代码非世界
  • 题解:洛谷 P1396 营救
  • 从0学习pwn【第一章】PWN学习环境搭建
  • 负债逾期别乱投医!2026正规债务协商规划机构排行榜,上岸党实测推荐 - 代码非世界
  • 题解:洛谷 P1194 买礼物
  • 避免提示设计踩雷的秘诀:提示工程架构师的用户流程测试风险评估
  • 免费白嫖可灵+阿里顶级AI,图片视频随便生!不限量
  • 大语言模型在AI原生应用领域的未来展望
  • 题解:洛谷 P3366 【模板】最小生成树
  • 大数据领域数据服务的人工智能算法优化
  • 【每日一题】LeetCode 696. 计数二进制子串
  • 信用卡逾期不用慌!全国专业贷款协商与逾期处理律所实测推荐,负债人上岸指南 - 代码非世界
  • 关于本人发布的应用的隐私策略
  • 股市赚钱学概论:赚钱理之一,赚红利的钱
  • 大数据领域数据工程的边缘计算数据处理方案
  • ANSYS/LS-DYNA 隧道光面爆破数值模拟(CAD+LS-DYNA)课程说明:模型建立、...
  • 我用 AI 写了四五个软件之后的总结
  • 测试一下32位CPU和64位CPU下的long类型变量大小
  • 《解析AI应用架构师眼中人机协作在未来工作的独特优势》
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(车之家)完整教程:从入门到实战部署
  • 企业微信协议接口的安全合规性设计与审计实践 - 教程