[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;//华丽的结束。
}
posted @   changwenxuan  阅读(18)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示