intmain(){ cin >> n >> m; for(int i = 0; i < m; i++){ int a, b, w; cin >> a >> b >> w; e[i] = {a, b, w}; } sort(e, e + m); for(int i = 1; i <= n; i++) p[i] = i; int cnt = 0, cost = 0; for(int i = 0; i < m; i++){ int a = e[i].a, b = e[i].b; int pa = find(a), pb = find(b); if(pa != pb){ p[pa] = pb; cost += e[i].w; cnt++; } } if(cnt < n - 1) cout << "orz" << endl; else cout << cost << endl; return0; }
/* 4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3 7 */
P2872 USACO07DEC Building Roads S
思路
如果 $i,j$ 之间有边,则设权重为 $0$, 否则计算出边权,然后MST算法。比较坑的地方在求欧氏距离的时候,$dx dx + dy dy$可能 int 溢出,所以需要转换成 long long 或者double。
#define x first #define y second typedef pair<int,int> PII; typedeflonglong ll; typedefstructEdge{ int a, b; double w; booloperator < (const Edge& e){ return w < e.w; } }e; constint N = 1010; PII q[N]; int p[N]; int n, m; bool st[N][N]; vector<e> vece;
doubleget_dist(PII a, PII b){ ll dx = a.x - b.x; ll dy = a.y - b.y; returnsqrt(dx * dx + dy * dy); }
intmain(){ cin >> n >> m; for(int i = 1; i <= n; i++) cin >> q[i].x >> q[i].y; for(int i = 1; i <= n; i++) p[i] = i; for(int i = 1; i <= m; i++) { int a, b; cin >> a >> b; vece.push_back({a, b, 0}); st[a][b] = st[b][a] = true; }
sort(vece.begin(), vece.end()); double res = 0; for(auto e : vece){ int a = find(e.a), b = find(e.b); if(a != b){ p[a] = b; res += e.w; } } printf("%.2lf\n", res);
#define x first #define y second typedef pair<int,int> PII; typedeflonglong ll; typedefstructEdge{ int a, b; double w; booloperator < (const Edge& e){ return w < e.w; } }e; constint N = 510; PII q[N]; int p[N]; int n, m; vector<e> vece;
doubleget_dist(PII a, PII b){ ll dx = a.x - b.x; ll dy = a.y - b.y; returnsqrt(dx * dx + dy * dy); }
intmain(){ cin >> m >> n; for(int i = 1; i <= n; i++) cin >> q[i].x >> q[i].y; for(int i = 1; i <= n; i++) p[i] = i; for(int i = 1; i <= n; i++){ for(int j = i + 1; j <= n; j++){ vece.push_back({i, j, get_dist(q[i], q[j])}); } }
sort(vece.begin(), vece.end()); double res = 0; int cnt = n; for(auto e : vece){ if(cnt <= m) break; int a = find(e.a), b = find(e.b); if(a != b){ p[a] = b; res = e.w; cnt--; } } printf("%.2lf\n", res);
typedef pair<int,int> PII; constint N = 1010; structEdge{ int a, b; double w; booloperator < (const Edge& e) const{ return w < e.w; } }e[N * N]; int p[N]; PII q[N]; int n, k, t;
intmain(){ cin >> n >> m >> s >> t; for(int i = 0; i < m; i++){ int a, b, w; cin >> a >> b >> w; e[i] = {a, b, w}; }
sort(e, e + m); for(int i = 1; i <= n; i++) p[i] = i;
int res = 0; for(int i = 0; i < m; i++){ int a = find(e[i].a), b = find(e[i].b); if(find(s) == find(t)) break; if(a != b){ p[a] = b; res = e[i].w; } } cout << res << endl; return0; }
intmain(){ cin >> n >> m >> k; for(int i = 0; i < m; i++){ int a, b, w; cin >> a >> b >> w; e[i] = {a, b, w}; }
sort(e, e + m); for(int i = 1; i <= n; i++) p[i] = i; int res = 0; for(int i = 0; i < m; i++){ if(k <= 0) break; int a = find(e[i].a), b = find(e[i].b); if(a != b){ p[a] = b; res += e[i].w; k--; } } cout << res << endl; return0; }
intmain(){ cin >> m >> n; for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ cin >> g[i][j]; } } for(int i = 1; i <= n; i++){ e[t++] = {0, i, m}; } for(int i = 1; i <= n; i++){ for(int j = i + 1; j <= n; j++){ if(g[i][j] != 0) e[t++] = {i, j, g[i][j]}; } }
sort(e, e + t); for(int i = 0; i <= n; i++) p[i] = i; int res = 0; for(int i = 0; i < t; i++){ int a = find(e[i].a), b = find(e[i].b); if(a != b){ p[a] = b; res += e[i].w; } } cout << res << endl; return0; }
intmain(){ cin >> n >> m >> k; for(int i = 0; i < m; i++){ int a, b, w; cin >> a >> b >> w; e[i] = {a, b, w}; }
sort(e, e + m); for(int i = 1; i <= n; i++) p[i] = i;
int res = 0, cnt = n; for(int i = 0; i < m; i++){ int a = find(e[i].a), b = find(e[i].b); if(cnt <= k) break; if(a != b){ p[a] = b; res += e[i].w; cnt--; } } if(cnt <= k) cout << res << endl; else cout << "No Answer" << endl; return0; }