Submission #1244193

#TimeUsernameProblemLanguageResultExecution timeMemory
1244193yue_laitimeismoney (balkan11_timeismoney)C++20
45 / 100
6 ms1156 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Edge { long long int u, v; long long int cost; long long int t, c; }; bool cmp(const Edge& a, const Edge& b) { return a.cost < b.cost; } vector<long long int> p; // 改為全域 vector long long int find_set(long long int i) { if (p[i] == i) return i; return p[i] = find_set(p[i]); // Path Compression } void unite_sets(long long int i, long long int j) { long long int root_i = find_set(i); long long int root_j = find_set(j); if (root_i != root_j) { p[root_j] = root_i; } } int main() { long long int n, m; while (cin >> n >> m) { p.assign(n, 0); // 調整 p 的大小並初始化 for (long long int i = 0; i < n; i++) { p[i] = i; } vector<Edge> edges; for (long long int i = 0; i < m; i++) { long long int u, v, t, c; cin >> u >> v >> t >> c; edges.push_back({u, v, t * c, t, c}); } sort(edges.begin(), edges.end(), cmp); long long int ans1 = 0; long long int ans2 = 0; vector<pair<long long int, long long int>> mst_edges; int edges_count = 0; for (const auto& edge : edges) { if (find_set(edge.u) != find_set(edge.v)) { unite_sets(edge.u, edge.v); ans1 += edge.t; ans2 += edge.c; mst_edges.push_back({edge.u, edge.v}); edges_count++; } } if (edges_count == n - 1) { cout << ans1 << " " << ans2 << "\n"; for (const auto& edge : mst_edges) { cout << edge.first << " " << edge.second << endl; } } else { cout << "-1\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...