求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;
}
求