求助
  • 板块学术版
  • 楼主billtun
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/8/9 14:25
  • 上次更新2024/8/9 15:21:56
查看原帖
求助
546730
billtun楼主2024/8/9 14:25

求P3959 Prim算法的HACK数据(尽量小一点的那种可以手搓的)

代码:

#include <bits/stdc++.h>
#define Maxn 15

using namespace std;

int n, m, a, b, len, minl;
vector<pair<int, int> > v[Maxn];
bool vis[Maxn];
struct Edge {
	int to, lgh, num;
	bool operator <(const Edge &a) const {
		return (a.lgh * a.num) <= (lgh * num);
	}
} p; priority_queue<Edge> q;
map<pair<int, int>, int> mp;
map<pair<int, int>, bool> viss;

int Prim(int st) {
	memset(vis, 0, sizeof vis);
	int cst = 0, x = 0, lgh = 0, num = 0;
	vis[st] = 1;
	for (int i = 0; i < (int)v[st].size(); i ++) {
		int to = v[st][i].first;
		p.to = to, p.num = 1, p.lgh = v[st][i].second;
		q.push(p);
	}
	
	while (!q.empty()) {
		p = q.top(), q.pop();
		x = p.to, lgh = p.lgh, num = p.num;
		if (vis[x]) { continue; }
		vis[x] = 1, cst += (lgh * num);
		
		for (int i = 0; i < (int)v[x].size(); i ++) {
			int to = v[x][i].first;
			p.to = to, p.lgh = v[x][i].second, p.num = num + 1;
			q.push(p);
		}
	} return cst;
}

int solve(int x) {
	return Prim(x);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n >> m;
	for (int i = 1; i <= m; i ++) {
		cin >> a >> b >> len;
		if (viss[make_pair(min(a, b), max(a, b))]) {
			mp[make_pair(min(a, b), max(a, b))] = min(len, mp[make_pair(min(a, b), max(a, b))]);
		} else {
			viss[make_pair(min(a, b), max(a, b))] = 1;
			mp[make_pair(min(a, b), max(a, b))] = len;
		}
	}
	
	for (int i = 1; i <= n; i ++) {
		for (int j = i + 1; j <= n; j ++) {
			if (viss[make_pair(i, j)]) {
				v[i].push_back(make_pair(j, mp[make_pair(i, j)]));
				v[j].push_back(make_pair(i, mp[make_pair(i, j)]));
			}
		}
	}
	
	minl = 9223372036854775807;
	for (int i = 1; i <= n; i ++) {
		minl = min(minl, solve(i));
	} cout << minl;
	return 0;
}

求

2024/8/9 14:25
加载中...