2 条题解
-
0
方法二:
//方法2: #include <bits/stdc++.h> using namespace std; const int MAXN = 1e4; struct Edge { int u, v, w; }; Edge b[MAXN]; int pa[MAXN], size[MAXN]; int n, m, total, sum; void init() { for (int i = 0; i < n; i++) { pa[i] = i; size[i] = 1; } } //查找x的树根 int find(int x) { if (pa[x] != x) pa[x] = find(pa[x]); return pa[x]; } //合并两个集合/两棵树 void join(int x, int y) { int px = find(x), py = find(y); if (px == py) return; if (size[px] < size[py]) swap(px, py); pa[py] = px; //小的树py接到大树px上 size[px] += size[py]; } bool cmp(Edge x, Edge y) { return x.w < y.w; } void kruskal() { int cnt = 0; for (int i = 0; i < m; i++) { int u = b[i].u, v = b[i].v, w = b[i].w; if (find(u) != find(v)) { join(u, v); cnt++; sum += w; if (cnt == n - 1) break; } } } int main() { cin >> n >> m; for (int i = 0; i < m; i++) { cin >> b[i].u >> b[i].v >> b[i].w; total += b[i].w; } init(); sort(b, b + m, cmp); kruskal(); cout << total - sum << endl; return 0; } -
0
方法一:
//方法1: #include <bits/stdc++.h> using namespace std; const int N = 101, M = 1e4 + 5; int n, k; int pa[N], size1[N]; struct Edge { int i, j, m; } a[M]; bool cmp(Edge e1, Edge e2) { return e1.m < e2.m; } void init() { for(int i=0; i<n; i++) { pa[i] = i; size1[i] = 1; } } int find(int x) { if(pa[x] != x) pa[x] = find(pa[x]); return pa[x]; } void join(int x, int y) { int px = find(x), py = find(y); if(px == py) return; if(size1[px] < size1[py]) swap(px, py); pa[py] = px; size1[px] += size1[py]; } int main(){ cin>>n>>k; init(); for(int i=0; i<k; i++) { cin>>a[i].i>>a[i].j>>a[i].m; } sort(a, a+k, cmp); int sum = 0; for(int i=0; i<k; i++) { int px = find(a[i].i), py = find(a[i].j); if(px != py) join(px, py); else sum += a[i].m; } cout<<sum; return 0; }
- 1
信息
- ID
- 869
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者