题解
2025-10-01 22:03:38
发布于:广东
3阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int u, v;
long long w;
bool operator<(const Edge& other) const {
return w < other.w;
}
};
vector<int> parent;
int find(int u) {
if (parent[u] != u) {
parent[u] = find(parent[u]);
}
return parent[u];
}
bool unite(int u, int v) {
u = find(u);
v = find(v);
if (u == v) return false;
parent[v] = u;
return true;
}
void solve() {
int N, M;
long long p;
cin >> N >> M >> p;
vector<Edge> edges(M);
for (int i = 0; i < M; ++i) {
cin >> edges[i].u >> edges[i].v >> edges[i].w;
edges[i].u--;
edges[i].v--;
}
parent.resize(N);
for (int i = 0; i < N; ++i) {
parent[i] = i;
}
sort(edges.begin(), edges.end());
long long mst_cost = 0;
int edges_used = 0;
vector<bool> in_mst(M, false);
for (int i = 0; i < M; ++i) {
if (unite(edges[i].u, edges[i].v)) {
mst_cost += edges[i].w;
in_mst[i] = true;
edges_used++;
}
}
if (edges_used != N - 1) {
cout << "NO" << endl;
return;
}
if (mst_cost > p) {
cout << "NO" << endl;
return;
}
long long current_sum = mst_cost;
int additional_edges = 0;
for (int i = 0; i < M; ++i) {
if (!in_mst[i]) {
if (current_sum + edges[i].w <= p) {
current_sum += edges[i].w;
additional_edges++;
} else {
break;
}
}
}
int total_edges_kept = (N - 1) + additional_edges;
int min_removed = M - total_edges_kept;
cout << min_removed << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
这里空空如也







有帮助,赞一个