[ABC288C] Don’t be cycle题解
题意
给你一个无向图,计算至少删除多少条边才能使得全图无环?
思路
假设在这张图中找到了 $k$ 个连通块,那么要使删除的边数最小,就把每个连通块都删成一棵树。一个连通块如果有 $t$ 个点,也就是 $t-1$ 条边,$k$ 个连通块就会有 $\sum {t-1}$ 条边 ,最终得到是 $n-k$ 条边。
再用总边数 $m$ 减去这个值,最终答案是 $m-(n-k)$。
代码实现
为了计算 $k$ 值,可以用 dfs 来遍历求值。
具体实现看注释。
#include<bits/stdc++.h>
using namespace std;
struct Node {//存图的结构体
long long sum,D[1000];//sum代表该点连接的边数,D数组储存联通的边。
} g[200005];//存点
int V[200005],n,m,k,x,y;//v数组标记是否已遍历到,n是点数,m是边数,k是要算的联通分量。
bool flag;//标记是否联通。
void dfs(long long v) {
if(V[v] == 0) {
V[v] = 1;//标记已查询。
flag = true;
for(long long i = 0; i<g[v].sum; i++) dfs(g[v].D[i]);//dfs该点所有边。
}
}
int main() {
cin >> n >> m;//输入点数和边数。
for(long long i=1; i<= m; i++) {
cin >> x >> y;//输入边。
g[x].D[g[x].sum++]= y,g[y].D[g[y].sum++]= x;//建图。
}
for(long long i=1; i<=n; i++) {
flag = false;//先设定它不连通。
dfs(i);//dfs
if(flag) k++;//联通则联通分量增加。
}
cout << m-(n-k);//输出。
return 0;//华丽的结束。
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!