NC213862. 修改
描述
输入描述
第一行两个整数 n,m,表示数列长度和操作个数
接下来 m 行,每行三个整数 ,意义见题目描述
输出描述
如果不存在一种选择操作的方式,输出 -1
否则输出最少支付的费用
示例1
输入:
2 3 1 2 3 1 1 100 2 2 101
输出:
103
示例2
输入:
5 4 1 1 1 2 2 1 3 3 1 4 4 1
输出:
-1
C++(clang++11) 解法, 执行用时: 183ms, 内存消耗: 3564K, 提交时间: 2020-11-18 16:49:21
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+10; struct edge { int u,v; ll w; }e[N<<1]; int n,m,cnt,fa[N]; ll ans; bool cmp(edge a,edge b) { return a.w<b.w; } int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int main() { cin>>n>>m; ++n; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w; sort(e+1,e+m+1,cmp); for(int i=1;i<=m;i++) { int rx=find(e[i].u),ry=find(e[i].v+1); if(rx!=ry) ans+=e[i].w,fa[rx]=ry,++cnt; } cout<<(cnt==n-1?ans:-1)<<endl; }