要想每一个地方都到达,那么肯定没环,所以就是去掉环中最小的一条边,反过来就是保留所有大的边,也就是最大生成树。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
struct node{
int u,v,w;
}g[maxn];
int fa[maxn];
int findfa(int x){
return fa[x]=fa[x]==x?x:findfa(fa[x]);
}
bool cmp(const node& a,const node& b){
return a.w>b.w;
}
int main(){
ios::sync_with_stdio(false),cin.tie(0);
int n,m;
while(cin>>n>>m){
int x,y;
for(int i=1;i<=n;i++){
cin>>x>>y;
fa[i]=i;
}
int ans=0,sum=0,cnt=0;
for(int i=0;i<m;i++){
cin>>g[i].u>>g[i].v>>g[i].w;
ans+=g[i].w;
}
sort(g,g+m,cmp);
for(int i=0;i<m;i++){
int tx=findfa(g[i].u);
int ty=findfa(g[i].v);
if(tx!=ty){
sum+=g[i].w;
cnt++;
fa[tx]=ty;
if(cnt==n-1) break;
}
}
cout<<m-cnt<<" "<<ans-sum<<endl;
}
return 0;
}