[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;//华丽的结束。
}

浙公网安备 33010602011771号