首页 > 其他分享 >AtCoder Beginner Contest 288 - C Don't be cycle 删除图中最少的边使得图中无环

AtCoder Beginner Contest 288 - C Don't be cycle 删除图中最少的边使得图中无环

时间:2023-08-19 15:45:50浏览次数:42  
标签:AtCoder typedef Don int long 图中 pair 边数 define

C - Don't be cycle

题意
给定一个 n 个顶点,m 条边的无向图,你需要删除图中的一些边使得图中不存在环
问你需要删除的最少边数?

思路
考虑连通块的生成树
一个由 n 个顶点组成的连通块最多只能有 n - 1 条边,不然就会成环。

那么对于本题,我们只需要找到每个连通块的顶点数,那么每个连通块的保留边数已知,最后利用总边数减去保留边数即为答案。

或者说,最终的答案也就是 边数 - 顶点数 + 连通块个数。因为每一个连通块的保留边数 = 总顶点数 - 1,那么对于所有的连通块求和就是上面的式子。

所以这题可以利用 DFS、BFS、并查集等做即可。并查集可以模拟加边操作,当加入的边构成环时这条边就可以删除,统计这样的边数即为答案。

代码

  • BFS
//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
//#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e5 + 5, inf = 0x3f3f3f3f, mod = 998244353;

void solve(){
	int n, m;
	cin >> n >> m;
	vector<int> e[n + 1];
	for(int i = 0; i < m; ++ i){
		int u, v;
		cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	vector<bool> vis(n + 1, false);
	queue<int> q;
	int ans = 0, c;
	for(int i = 1; i <= n; ++ i){
		if(!vis[i]){
			c = 0;
			q.push(i);
			while(!q.empty()){
				int u = q.front(); q.pop();
				if(vis[u]) continue;
				++ c;
				vis[u] = true;
				for(auto v : e[u]){
					if(!vis[v]){
						q.push(v);
					}
				}
			}
			ans += c - 1;
		}
	}
	cout << m - ans << '\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}
  • DSU
//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
//#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e5 + 5, inf = 0x3f3f3f3f, mod = 998244353;

struct DSU{
	int num;
	vector<int> fa;
	DSU(int x = maxm) : num(x), fa(x + 1){
		for(int i = 0; i <= x; ++ i) fa[i] = i;
	}
	int findfa(int x){//迭代实现,用于数范围大时
		while (x != fa[x]) x = fa[x] = fa[fa[x]];
		return x;
	}
	// int findfa(int x){ return fa[x] == x ? x : fa[x] = findfa(fa[x]); }//递归实现,压缩路径
	void merge(int u, int v){
		fa[findfa(u)] = findfa(v); return ;
	}
	bool same(int u, int v){ return findfa(u) == findfa(v); }
};

void solve(){
	int n, m;
	cin >> n >> m;
	DSU dsu(n);
	int ans = 0;
	for(int i = 0; i < m; ++ i){
		int u, v;
		cin >> u >> v;
		if(dsu.same(u, v)) ++ ans;
		dsu.merge(u, v);
	}
	cout << ans << '\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Don,int,long,图中,pair,边数,define
From: https://www.cnblogs.com/Qiansui/p/17642505.html

相关文章

  • C# readonly修饰符
    readonly修饰符在作祟强化官方解释:readonly是一个修饰字段的关键字:被它修饰的字段只有在初始化或者构造函数中才能够赋值.readonly修饰的引用类型字段必须始终引用同一对象:readonly修饰符可防止字段替换为引用类型的其他实例,但是,readonly不会妨碍通过该字段修改字段引用的......
  • Atcoder_[abc284E]Count Simple Paths题解
    题目链接这题就是很简单的图上深搜,我觉得放在E题太水了,代码里有详细注释。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvector<int>v[200010];//邻接表intans;//答案boolvis[200010];//vis[i]记录i号点有没有被访问过voiddfs(intx)......
  • AtCoder Beginner Contest 311 - D(思维题)
    目录D-GridIceFloorABC简单题D思维题D-GridIceFloor题意给定一个\(n\timesm\)的矩阵,矩阵每个位置上的字符要么是'.'要么是'#',保证矩阵的最外围一圈都是'#'。玩家初始位于位置(2,2)。玩家可以进行移动,但是移动有条件:玩家首先选定一个移动方向,之后在这个方......
  • 一文教你如何实现低代码轮播图中点击图片跳转不同的H5页面
    【关键字】低代码开发、API6、轮播图组件、Item实例数据获取、H5页面跳转 1、写在前面实际开发中我们经常会遇到这样的场景,首页轮播图加载了几张活动图片,每张图片点击之后会跳转到各自不同的活动详情页面,活动详情是通过H5页面实现的,现在我们来思考一下在API6的低代码开发中该......
  • 一文教你如何实现低代码轮播图中点击图片跳转不同的H5页面
     【关键字】低代码开发、API6、轮播图组件、Item实例数据获取、H5页面跳转1、写在前面实际开发中我们经常会遇到这样的场景,首页轮播图加载了几张活动图片,每张图片点击之后会跳转到各自不同的活动详情页面,活动详情是通过H5页面实现的,现在我们来思考一下在API6的低代码开发中该如何......
  • AtCoder-ABC-267 C - Index × A(Continuous ver
    C-Index×A(Continuousver.)题目大意:给定n个数(\(a_1,a_2...a_n\)),从中选连续m个数,这m个数的和为:\(\sum_{i=1}^mi*b_i\)求最大的和为多少。\(1<=m<=n<=2*10^5\)\(-2*10^5<=a_i<=2*10^5\)解题思路首先m个数为一组,那么最多有n-m+1组,这个数量是可以被遍历的,但是......
  • AtCoder-ABC-309 C - Medicine
    C-Medicine题目大意:给n种药,第i种药吃\(a_i\)天,每天\(b_i\)粒。问最早在第几天,当天要吃的药≤K。\(1<=n<=3*10^5\)\(0<=k<=10^9\)\(1<=a_i,b_i<=10^9\)解题思路首先了解了n种药,每次都是从第一天开始,持续\(a_i\)天,所以我当时直接想到用差分来做,数组初始全为......
  • "Don't be shy. Speak English loudly and crazily!"
    "Don'tbeshy.SpeakEnglishloudlyandcrazily!" 俞敏洪犀利点评马云、王石、刘强东、雷军英语水平俞敏洪:马云8岁学英语,考上杭师范读专科,而我在北大读本科! 李阳、马云、俞敏洪,这三个中国最著名的英语老师,只有李阳仍坚守在一线。是啊,当马云再次登上福布斯中国富豪榜......
  • AtCoder Beginner Contest 314
    AtCoderBeginnerContest314-AtCoderA-3.14(atcoder.jp)题目提供了100位,所以直接用字符串输出#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);strings="3.14......
  • AtCoder Beginner Contest 314
    AtCoderBeginnerContest314-AtCoderA3.14voidsolve(){strings="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";intn;cin>>n;cout<<s.substr(0,n......