Untitled
unknown
c_cpp
a year ago
2.5 kB
5
Indexable
#include <iostream> #include <vector> #include <algorithm> #include <utility> using namespace std; struct Edge { int u, v, weight; }; struct DisjointSet { vector<int> parent, rank; DisjointSet(int n) { parent.resize(n); rank.resize(n, 0); for (int i = 0; i < n; i++) { parent[i] = i; } } int find(int x) { if (parent[x] != x) { parent[x] = find(parent[x]); } return parent[x]; } void unite(int x, int y) { int rootX = find(x); int rootY = find(y); if (rootX != rootY) { if (rank[rootX] < rank[rootY]) { parent[rootX] = rootY; } else if (rank[rootX] > rank[rootY]) { parent[rootY] = rootX; } else { parent[rootY] = rootX; rank[rootX]++; } } } }; bool compareEdges(const Edge& a, const Edge& b) { return a.weight < b.weight; } vector<pair<int,int> > mst[3030]; int findMinimumSpanningTreeWeights(int n, int m, vector<Edge> edges) { sort(edges.begin(), edges.end(), compareEdges); int ans = 0; DisjointSet ds(n); for (int i = 0; i < m; i++) { int u = edges[i].u; int v = edges[i].v; int weight = edges[i].weight; if (ds.find(u) != ds.find(v)) { ds.unite(u, v); mst[u].push_back(make_pair(v,weight)); mst[v].push_back(make_pair(u,weight)); ans += weight; } } return ans; } int vis[3030]; int dfs(int u, int v) { if(u == v) { for(int i = 0; i < 3030; i++) vis[i] = 0; return 0; } vis[u] = 1; for(int i = 0; i < mst[u].size(); i++) { if(vis[mst[u][i].first] == 0) { int a = dfs(mst[u][i].first, v); if(a != -1) { return max(a,mst[u][i].second); } } } return -1; } int main() { int n, m; cin >> n >> m; vector<Edge> edges(m); for (int i = 0; i < m; i++) { cin >> edges[i].u >> edges[i].v >> edges[i].weight; } int mstSize = findMinimumSpanningTreeWeights(n, m, edges); for (int i = 0; i < m; i++) { cout << mstSize + edges[i].weight - dfs(edges[i].u, edges[i].v) << endl; } return 0; }
Editor is loading...
Leave a Comment