1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include<bits/stdc++.h> using namespace std; #define pr pair<int,int> const int N = 5e3+5; int n,m; vector<vector<pr>> g(N); vector<array<int,3>> G; vector<array<int,3>> mst; vector<int> fa(N); int ans; int vis[N];
int findroot(int k) { if(k == fa[k]) { return k; } return fa[k] = findroot(fa[k]); }
void connect(int i,int j) { int ri = findroot(i); int rj = findroot(j); if(ri == rj) return; fa[ri] = rj; }
bool isconnected(int i,int j) { int ri = findroot(i); int rj = findroot(j); return ri == rj; }
int main() { cin>>n>>m; for(int i=1;i<=n;i++) fa[i] = i; for(int i=0;i<m;i++) { int x,y,z; cin>>x>>y>>z; G.push_back({z,x,y}); connect(x,y); } for(int i=2;i<=n;i++) { if(!isconnected(1,i)) { cout<<"orz\n"; return 0; } } for(int i=1;i<=n;i++) fa[i] = i; sort(G.begin(),G.end());int index = 0; while(mst.size() < n-1 && index < G.size()) { auto [weight,u,v] = G[index];index++; if(isconnected(u,v)) continue; connect(u,v); mst.push_back({weight,u,v}); ans+=weight; } cout<<ans<<"\n"; return 0; }
|