2018TYUT暑期ACM模拟赛(1)
Destroy Walls HDU - 6187
题意:n,m代表n个地点,m堵墙。要把墙拆了,使点点之间可以互相到达。
思路:没给的墙,就代表是互通的。因为这个情况,所以如果找最小生成树,将边权从小到大排序,然后去除,答案不一定是最优解。只要判断这个图里面没有环就可。所以构造最大生成树,用边权和值-最大生成树的值,以及m-构造的树的边。为所得答案。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int f[maxn];
struct node{
int to,u,w;
bool operator <(const node &u)const{
return w>u.w;//从大到小排序
}
}e[2*maxn];
int find(int a){
return f[a]==a?a:f[a]=find(f[a]);
}
int main()
{
int n,m;
int x,y,z;
while(cin>>n>>m){
long long sum=0;
for(int i=1;i<=n;i++){
cin>>x>>y;f[i]=i;
}
for(int i=0;i<m;i++){
cin>>e[i].to>>e[i].u>>e[i].w;
sum+=e[i].w;
}
sort(e,e+m);
int cnt=0;
int cnt1=0;
for(int i=0;i<m;i++){
x=find(e[i].to),y=find(e[i].u);//查找,
if(x!=y)
{
cnt++;
f[y]=x;//合并
cnt1+=e[i].w;
}
}
cout<<m-cnt<<" "<<sum-cnt1<<endl;
}
return 0;
}