当前位置:网站首页>(2022杭电多校六)1010-Planar graph(最小生成树)
(2022杭电多校六)1010-Planar graph(最小生成树)
2022-08-08 23:06:00 【AC__dream】
题目:
题意:给n个点和m条边,m条边将一个图分成若干个连通区域,然后我们可以删除一些边,问至少删除多少条边才能使得所有的区域是连通的,在所有的删边情况中选择字典序最小的一种情况进行输出。
先来思考一下,什么情况下才能使得所有区域是连通的?其实画个图观察不难发现,只有当图中没有环时整个区域才是连通的,现在问题就转化为我们至少删除多少条边才能使得图中没有环,由于树是一个没有环的最大连通子图,所以显然是将图删边使其形成一棵树,这样的话删除的边数一定是最小的,由于题目中要求删除的边的字典序最小,那么我们就可以考虑从编号大的边开始添加边,只要加进去该边不成环就把该边加入图中,这样最后没有加入图中的边就是我们要删除的边,那么我们直接按照字典序进行从小到大输出即可,这个过程就是利用类似kruscal的过程进行实现,只是我们不是按照边权进行排序,而是按照编号进行排序。
下面是代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#include<cmath>
using namespace std;
const int N=2e6+10;
int fu[N],u[N],v[N];
int find(int x)
{
if(x!=fu[x]) fu[x]=find(fu[x]);
return fu[x];
}
stack<int>st;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fu[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d",&u[i],&v[i]);
for(int i=m;i>=1;i--)
{
int fx=find(u[i]),fy=find(v[i]);
if(fx==fy)
st.push(i);
else
fu[fx]=fy;
}
printf("%d\n",st.size());
while(!st.empty())
{
printf("%d ",st.top());
st.pop();
}
puts("");
}
return 0;
}
边栏推荐
- ArcPy要素批量转dwg
- Xcode 创建一个Dylib 插件deb项目
- MySQL indexes a field in a table
- 影响你各应用间网速的QoS你了解吗?
- (2022杭电多校六)1012-Loop(单调栈+思维)
- You know you every day in the use of NAT?
- 如何使用 Eolink 实现 API 文档自动生成
- 【Verilog基础】关于芯片中信号串扰的理解
- Dynamic Host Configuration Protocol DHCP (DHCPv4)
- (Codeforce 757)E. Bash Plays with Functions(积性函数)
猜你喜欢
随机推荐
二叉树 层次遍历 及例题
Ant Forest Offline crawlers automatically collect energy, raise chickens, and other operations
微信小程序错误 undefined Expecting ‘STRING‘,‘NUMBER‘,‘NULL‘,‘TRUE‘,‘FALSE‘,‘{‘,‘[‘, got ]解决方案
C语言 库函数汇总2019.10.31
ArcPy设置全库唯一标识码
JSDay1-合并两个有序数组
影响你各应用间网速的QoS你了解吗?
JSDay2-两个数组的交集
机器学习之知识点(一)
Xcode 创建一个Dylib 插件deb项目
(2022牛客多校五)B-Watches(二分)
用模态框 实现 注册 登陆
Hi3516 use wifi module
JSDay2-多个数组的交集
如何搭建一套自己公司的知识共享平台
数组去重的几种方法
【Verilog基础】关于芯片中信号串扰的理解
【YOLOv5】6.0环境搭建(不定时更新)
iptables防火墙内容全解
IMConversation 或 IMUser 类型数据