题意:摧毁多少个墙能让国王能到达任何一个坐标点
前面题目给的坐标没用,只用用后面的数据,将Kruskal的cmp判断小于号改为大于号就是最大生成树。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int sz = 2e5+5;
struct node{
int u;
int v;
int cost;
}a[sz];
int p[sz];
bool cmp(node a,node b){
return a.cost>b.cost;
}
int findd(int x){
if(p[x] == x) return x;
return p[x] = findd(p[x]);
}
int main(){
int n,m,x,y,num,res,kaishi;
while(cin>>n>>m){
kaishi = 0;
for(int i = 1;i<=n;++i)
cin>>x>>y,p[i] = i;
for(int i = 0;i<m;++i){
cin>>a[i].u>>a[i].v>>a[i].cost;
kaishi += a[i].cost;
}
sort(a,a+m,cmp);
num = res = 0;
for(int i = 0;i<m;++i){
node e = a[i];
x = findd(e.u),y = findd(e.v);
if(x != y){
++num;
p[x] = y;
res += e.cost;
}
}
cout<<m-num<<" "<<kaishi-res<<endl;
}
return 0;
}