10pts 求助!
查看原帖
10pts 求助!
809124
Eliauk_FP楼主2023/8/19 10:12
#include <bits/stdc++.h>
using namespace std;

const int N = 310;
struct node{
	int d, x;
};

vector <int> g[N];
int n, m, ans;
int d[N];
bool vis[N], v[N];

bool operator > (const node &a, const node &b) {
	return a.d > b.d;
}
priority_queue <node, vector <node>, greater <node> > q;

int cut(int x, int fa) {
	int num;
	v[x] = 1;
	vis[x] = 1;
	for (int i = 0; i < g[x].size(); i++) {
		if (g[x][i] == fa || vis[g[x][i]]) continue;
		num += cut(g[x][i], x);
	}
	return num;
}
void recut(int x, int fa) {
	v[x] = 0;
	vis[x] = 0;
	for (int i = 0; i < g[x].size(); i++) {
		if (g[x][i] == fa || vis[g[x][i]]) continue;
		recut(g[x][i], x);
	}
	return ;	
}
void dfs(int x, int fa, int cnt, int dist) {
	v[x] = 1;
	ans = max(cnt, ans);
	int num = 0;
	if (dist == d[x] && x != 1) {
		//cout << num << ' ';
		for (int i = 0; i < g[fa].size(); i++) {
			if (v[g[fa][i]]) continue;
			num = cut(x, fa);
			dfs(g[fa][i], fa, cnt + num, dist + 1);
			recut(x, fa);
		}
	}
	else {
		for (int i = 0; i < g[x].size(); i++) {
			if (v[g[x][i]]) continue;
			dfs(g[x][i], x, cnt, dist + 1);
		}
	}
	//return ;
}
void dijkstra(int st) {
	memset(d, 0x3f, sizeof(d));
	q.push((node){d[st], st});
	d[st] = 0;
	while (!q.empty()) {
		int x = q.top().x;
		q.pop();
		for (int i = 0; i < g[x].size(); i++) {
			int y = g[x][i];
			if (d[x] + 1 < d[y]) {
				d[y] = d[x] + 1;
				q.push((node){d[y], y});
			}
		}
	}
	return ;
}

int main() {
	scanf("%d%d", &n, &m);
	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		g[x].push_back(y);
		g[y].push_back(x);
	} 
	dijkstra(1);
	dfs(1, 0, 0, 0);
	printf("%d", n - ans);
	return 0;
}

10pts 脑洞有点大

2023/8/19 10:12
加载中...