P1656 炸铁路

题目描述

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

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

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

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

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

输入格式

第一行 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 从小到大排序。

输入输出样例

输入

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

输出

1 2
5 6

炸毁一条路对于一张图来说,本质上就是去掉一条边,不能通过铁路到达就代表这张图不连通了,对于这种去掉之后就可以使整张图不再连通的边,我们称之为割边

这道题的本质就是求出这张图所有的割边。

废话不多说,开始推思路

这里要用到两个数组:

时间戳 dfn

追溯值 low

这两个数组在受欢迎的牛里面里面讲过,这里就不多说了

回到题目,首先要解决的问题就是如何判断现在的这条边是不是割边

首先说结论:x和y两个点,low[y]>dfn[x] 就代表x到y这条边是割边

为什么这么说呢?

如果y的追溯值大于了x的时间戳,也就是y的追溯值在x之后,并且,y追溯到的这个点与x一定不连通,因为如果连通,那么y就会顺着这个点追溯到时间戳更小的点x,到这里,我们不难推出:x与y之间直接连通的边,只有这一条,并且没有间接联通的边。所以,如果low[y]>dfn[x],这条边就是割边

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m;
int dfn[N];
int vis[N];
int low[N];
struct node{int x,y;
};
node c[N];
vector<int>a[N];
int cnt;
int times;
bool cmp(node a,node b){return (a.x<b.x)||(a.x==b.x&&a.y<b.y);
}
void add(int u,int v){cnt++;c[cnt].x=min(u,v);c[cnt].y=max(u,v);
}
void tarjan(int x,int fa){vis[x]=1;dfn[x]=low[x]=++times;for(int i=0;i<a[x].size();i++){int y=a[x][i];if(dfn[y]==0){tarjan(y,x);low[x]=min(low[x],low[y]);if(low[y]>dfn[x])add(x,y);//判断割边}if(y!=fa&&dfn[y]!=0)low[x]=min(low[x],dfn[y]);}
}
main(){scanf("%d%d",&n,&m);int u,v;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);a[u].push_back(v);a[v].push_back(u);}for(int i=1;i<=n;i++)if(dfn[i]==0)tarjan(i,i);sort(c+1,c+1+cnt,cmp);for(int i=1;i<=cnt;i++)printf("%d %d\n",c[i].x,c[i].y);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue--》从零开始打造交互体验一流的电商平台(三)

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…

leetcode刷题(46-50)

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可以啦…

【机器学习】 第1章 概述

一、概念 1.机器学习是一种通过先验信息来提升模型能力的方式。 即从数据中产生“模型”( model )的算法&#xff0c;然后对新的数据集进行预测。 2.数据集&#xff08;Dataset&#xff09;&#xff1a;所有数据的集合称为数据集。 训练集&#xff1a;用来训练出一个适合模…

TCP/UDP协议传输

TCP 客户端 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h>//宏定义错误输出格式>>>>类比封装函数#…

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如&#xff0c;一名黑客利用了 Paid 网络的智能…

ansible 模块进阶及变量

yum 模块进阶 - name: install pkgs hosts: webservers tasks: - name: install web pkgs # 此任务通过yum安装三个包 yum: name: httpd,php,php-mysqlnd state: present # 根据功能等&#xff0c;可以将一系列软件放到一个组中&#xff0c;安装软件包组&#xff0c;将会把很…

shell脚本之数组及冒泡排序

1.数组定义&#xff1a;在集合当中指定多个元素&#xff0c;元素的类型可以是整数、字符串及浮点。 2.数组作用&#xff1a;一次性的定义多个元素&#xff0c;可以为变量赋值提供便利。 3.数组的定义方法&#xff1a; 数组名&#xff08;a b c d&#xff09; 数组名不能重复…

IPV6配置二

IV6 的单播路由协议-----在使用路由协议前一定需要开启 IPV6的单播路由功能&#xff0c;否则不转发IPV6的流量 【1】IPV6 静态路由协议&#xff1a; (1)普通静态路由 rl(config)#ipv6 route 2::/64 serial 1/1 rl(config)#ipv6 route 2::/64 12:2 &#xff1f; …

【速过】2024年9月三级数据库技术题库+知识点总结

24年3月已经考了一次数据库&#xff0c;实话&#xff0c;三级比二级简单一些&#xff0c;知识点都比较集中&#xff0c;50%-60%是题库里面的原题&#xff0c;考前只要好好的过一遍题库考到80以上完全没有问题&#xff0c;你实在不会答案背下来也是可以的&#xff0c;不过更多的…

kotlin函数

1、函数定义 // 下边定义了main函数 fun main() {} 2、函数的类型 // foo函数定义 fun foo () {} // 对应无参类型 () -> Unit fun foo (a: Int):String {} // 对应有参类型 (Int) -> String 3、函数的引用 函数的引用类似C语言中的函数指针&#xff0c;可用于函数传…

外包干了2年,彻底废了...

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

选择江苏显卡服务器租用的优势有哪些?

显卡服务器有着强大的计算功能&#xff0c;可以使用图形处理器进行计算与运算&#xff0c;十分适用于对计算性能需求比较高的企业和组织&#xff0c;本文主要来介绍选择江苏显卡服务器租用的优势有哪些吧&#xff01; 江苏显卡服务器使用了先进的实时高速的并行计算技术和浮点计…

【docker安装rabbitmq】

docker安装rabbitmq 1.查阅rabbitmq的Dokcer Hub官方说明 rabbitmq地址&#xff0c;因为我们需要使用的是带管理界面的rabbitmq服务。所以我们需要下载的rabbitmq:management镜像 docker pull rabbitmq:management2.启动rabbitmq 2.1.快速启动 One of the important thing…

Go中的channel是同步还是异步

Go语言中的channel可以是异步也可以是同步&#xff0c;这取决与它是否是一个缓冲的channel。 同步channel 无缓冲的channel默认是同步的channel类型&#xff0c;即创建时没有执行缓冲大小。当数据被发送到无缓冲的channel中时&#xff0c;发送者会阻塞直到接受者收到数据。同…

笔记本系统盘移植与windowsLinux双系统安装

目录 一、 前言二、 Windows系统移植二、 安装Linux三、 Windows分区配置 一、 前言 笔记本内存不够了&#xff0c;之前给笔记本添加了一个机械硬盘&#xff0c;也几乎爆满了&#xff0c;于是购置了1T的固态硬盘&#xff0c;打算用这个固态硬盘安装双系统&#xff0c;剩余空间…

胡说八道(24.6.18)——通信杂谈(科普知识)

既聊完中国和西方的通信历史之后&#xff0c;咱们继续来看看与有线通信相对应的无线通信&#xff0c;至于有线通信线的类型这里就不多说&#xff0c;像电话线&#xff0c;光纤&#xff0c;电缆(用于有线电视信号传输、早期的计算机网络)等&#xff0c;这些都是有线通信的范围。…

[面试题]消息队列

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列 什么是…

GPT4v和Gemini-Pro调用对比

要调用 GPT-4 Vision (GPT-4V) 和 Gemini-Pro&#xff0c;以下是详细的步骤分析&#xff0c;包括调用流程、API 使用方法和两者之间的区别&#xff0c;以及效果对比和示例。 GPT-4 Vision (GPT-4V) 调用步骤 GPT-4 Vision 主要通过 OpenAI 的 API 进行调用&#xff0c;用于处…

【趣味测试】

编程过程中遇到的趣味知识 1 Cpp 1.1 浮点数计算 if (0.1 0.2 0.3) {std::cout << "0.1 0.2 0.3 true" << std::endl;} else {std::cout << "0.1 0.2 0.3 false" << std::endl;}if (0.1 0.3 0.4) {std::cout << &…

喜讯!昂辉科技通过2024年度重点产业链企业(第一批)认定

日前&#xff0c;合肥市推进战略性新兴产业发展工作委员会办公室公布了 2024年度重点产业链企业&#xff08;第一批&#xff09;新入库名单&#xff08;集成电路、新型显示、网络与信息安全、城市安全、空天信息、新能源汽车和智能网联汽车、生物医药、新材料、高端装备、节能环…