NC53074. Forsaken喜欢独一无二的树
描述
输入描述
第一行输入为和,表示这个图的点数和边数。接下来行,每行三个值,,,分别代表每条边的两个端点和边权。
输出描述
一个整数,代表删除的边的最小权值和。
示例1
输入:
1 0
输出:
0
C++ 解法, 执行用时: 108ms, 内存消耗: 3532K, 提交时间: 2022-07-16 09:44:05
#include<bits/stdc++.h> using namespace std; struct node { int x,y,w; }E[200005]; bool cmp(node a,node b) { return a.w<b.w; } int n,m,V[200005]; int find(int a) { if(a==V[a])return a; return V[a]=find(V[a]); } int main() { int i,j,k,a,b; long long ans=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++)V[i]=i; for(i=0;i<m;i++)scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].w); sort(E,E+m,cmp); for(i=0;i<m;i=j) { for(j=i+1;j<m&&E[i].w==E[j].w;j++); for(k=i;k<j;k++) { a=find(E[k].x),b=find(E[k].y); if(a!=b)ans+=E[k].w; } for(k=i;k<j;k++) { a=find(E[k].x),b=find(E[k].y); if(a!=b)V[a]=b,ans-=E[k].w; } } printf("%lld\n",ans); return 0; }