2 条题解
-
1
我们看到最小生成树和输出该树的总权重以及所选边的索引序列,最合适的自然就是算法,它可以模拟整颗树的构造过程,最适配这种题
这道题有点板,就不用过多解释了,但我就不用普通写法......
#include<bits/stdc++.h> using namespace std; const int N=5e5+10; struct node{int u,v,w,id;}G[N]; int n,m,fa[N]; long long ans; vector<int>s; bool cmp(node a,node b){return a.w<b.w;} int find(int x){return (fa[x]==x)?x:fa[x]=find(fa[x]);} bool pd(int x,int y) { int rx=find(x),ry=find(y); if(rx==ry)return 0; fa[ry]=rx; return 1; } int main() { scanf("%d%d",&n,&m); for(int i=1,x,y,z;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); G[i]={x,y,z,i-1}; } sort(G+1,G+m+1,cmp);//保证贪心,优先小边权 for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=m&&s.size()<n-1;i++) { if(pd(G[i].u,G[i].v)) { ans+=G[i].w; s.push_back(G[i].id); } } printf("%lld\n",ans); for(int i=0;i<n-1;i++)printf("%d ",s[i]); return 0; } -
1
#include<bits/stdc++.h> using namespace std; const int N = 5e5 + 10; #define int long long typedef tuple<int, int, int, int> tp4; priority_queue<tp4, vector<tp4>, greater<tp4> > edge; int fa[N], n, m; int findfa(int x){return (fa[x] == x ? fa[x] : fa[x] = findfa(fa[x]));} bool merge(int x, int y) { int xfa = findfa(x), yfa = findfa(y); if (xfa == yfa) return 0; fa[xfa] = yfa; return 1; } signed main() { cin >> n >> m; for (int i = 1; i <= n; i++) fa[i] = i; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; u ++; v ++; edge.push({w, u, v, i}); } int t = n - 1, sum = 0; vector<int> vec; while (t) { auto [w, u, v, i] = edge.top(); edge.pop(); if (merge(u, v)) t --, sum += w, vec.push_back(i); } cout << sum << endl; for (auto i : vec) cout << i - 1 << " "; return 0; }
- 1
信息
- ID
- 8178
- 时间
- 500ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 15
- 已通过
- 9
- 上传者