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

特殊图判断

K LilaS的特殊图判断 - 第七届校赛正式赛 —— 补题

题目大意:

给定一个无向图,图中有 N N N 个顶点,编号为 1 − N 1-N 1N M M M 条边,编号为 1 − M 1-M 1M 。第 i i i 条边连接顶点 u i u_i ui v i v_i vi 。存在重边和自环。

有没有一种算法能快速判断该无向图中的每个连通部分是否满足:连通部分的顶点和边的数量相同

如果该图中每个连通部分都满足条件,则输出 Yes;否则,输出 No

1 < = N < = 2 ∗ 1 0 5 1<=N<=2*10^5 1<=N<=2105

0 < = M < = 2 ∗ 1 0 5 0<=M<=2*10^5 0<=M<=2105

1 < = u i < = v i < = N 1<=u_i<=v_i<=N 1<=ui<=vi<=N

思路:

考虑并查集,维护祖先节点中 顶点个数 和 边的个数

int fa[N],sz[N],ver[N];

fa[i]=i,sz[i]=1,ver[i]=0;

int u,v;
u=find(u),v=find(v);
如果祖先节点相同,那么点的个数不用增加,考虑给祖先节点多加一条边
    if(u==v){
        ver[u]++;
    }
如果祖先节点不相同,那么将这两个连通块合并,随便找一个节点为祖宗节点即可
    else{
        fa[v]=u;
        sz[u]+=sz[v];
        ver[u]+=ver[v]+1;//这条边
    }

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define PII pair<int,int>
#define lowbit(x) x&-x
#define ALL(x) x.begin(),x.end()

const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int fa[N],sz[N],ver[N];
int n,m;
int find(int x){
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}


void solve() {
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		fa[i]=i;
		sz[i]=1;
		ver[i]=0;
	}
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;
		
		u=find(u),v=find(v);
		if(u==v){
			ver[u]++;
			continue;
		}
		if(u!=v){
			fa[v]=u;
			sz[u]+=sz[v];
			ver[u]+=ver[v]+1;
		}else{
			ver[u]++;
		}
	}
	
//	cout<<'\n';
	for(int i=1;i<=n;i++){
		int u=find(i);
//		cout<<sz[u]<<" "<<ver[u]<<'\n';
		if(sz[u]!=ver[u]){
			cout<<"No\n";
			return ;
		}
	}
	cout<<"Yes\n";
}

signed main() {
	std::ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T = 1;
//	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}
http://www.dtcms.com/a/107321.html

相关文章:

  • 【论文笔记】Llama 3 技术报告
  • SQL 语言基础:分组集(Grouping Sets)、CUBE 和 ROLLUP
  • blender二次元上色
  • TypeScript:环境安装与配置全指南
  • HTTP keepalive 详解
  • RAG(检索增强生成)技术构建垂直领域或个人知识库
  • RNN模型及NLP应用(3/9)——Simple RNN 模型
  • ngx_vslprintf
  • 【LLM基础】DeepSpeed基础知识
  • count查询详解
  • 【FPGA】状态机思想回顾流水灯
  • Google Gemini 2.0 网页抓取真丝滑
  • Golang的文件处理优化策略
  • STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出
  • [Lc6_记忆化搜索] 不同路径 | 解决智力问题 | 有序三元组中的最大值
  • Ansible内置模块之systemd
  • 【区块链+ 房产建筑】山东省建筑产业互联网平台 | FISCO BCOS 应用案例
  • 【Linux】文件系统知识梳理:从磁盘硬件到文件管理
  • C++IO流类库
  • 单元测试原则之——不要模拟值对象 (1)
  • SIMD技术:定义、与AI的关联及推理加速
  • HarmonyOS-ArkUI Rcp模块类关系梳理
  • Flask+Vue构建图书管理系统及Echarts组件的使用
  • 使用SpringBoot + Thymeleaf + iText实现动态PDF导出
  • pollinations 一个免费文生图、声音、文网站
  • PhotoShop学习05
  • springcloud configClient获取configServer信息失败导致启动configClient注入失败报错解决
  • 安徽京准:GPS北斗卫星校时服务器助力大数据云计算
  • 《Linux内存管理:实验驱动的深度探索》大纲
  • 项目练习:若依系统二次开发中,某些情况下,v-hasPermi不适合的解决办法