为啥是wa了一个点呢?求大佬
查看原帖
为啥是wa了一个点呢?求大佬
890233
gmx0424楼主2023/10/31 17:15
/*
题目:n个点,m条边,问还需要添加几条边才能使任意两点之间至少有两条边相连

边双联通分量

1)缩点	----->树
2)找树的叶子节点,ans = (叶子节点+1)/ 2 
*/

#include<bits/stdc++.h>
using namespace std;
int n, m;
stack<int> s;
const int maxn = 5005;
const int maxm = 10005;
int cnt, head[maxn] ;
int dfn[maxn], low[maxn], timer ;
int bcc_cnt, bcc[maxn], deg[maxn] ;

struct node{
	int to, next;
} G[maxm << 1] ;


void add(int u, int v){
	++cnt;
	G[cnt].to = v;
	G[cnt].next = head[u];
	head[u] = cnt;
}


void tarjan(int u, int fa){	//边双 
	dfn[u] = low[u] = ++timer;
	s.push(u);
	for (int i = head[u]; i; i = G[i].next){
		int v = G[i].to;
		if (dfn[v] == 0){
			tarjan(v, u);
			low[u] = min (low[u], low[v]);
		}else if(v != fa) {
			low[u] = min (low[u], dfn[v]);
		}
	}
	if (low[u] == dfn[u]){
		++bcc_cnt;
		while (1) {
			int x = s.top();
			s.pop();
			bcc[x] = bcc_cnt;
			if (x == u) break;
		}
	}	
}


int main (){
	cin >> n >> m;
	for (int i = 1; i <= m; i++ ){
		int u, v;
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	
	for (int i = 1; i <= n ;i++){
		if (dfn[i] == 0) tarjan(i, -1);
	}
	
	for (int u = 1; u <= n; u++){//直接在新图上记录度 
		for (int i = head[u]; i; i=G[i].next){
			int v = G[i].to;
			if (bcc[u] != bcc[v]) {
				deg[bcc[u]]++;
			}
		}
	}
	
	int num = 0;
	
	for (int i = 1; i <= bcc_cnt; i++){
		if (deg[i] == 1) {
			num++;
		}
	}
	cout << (num + 1) / 2;
	return 0;
}
2023/10/31 17:15
加载中...