Destroy Walls HDU - 6187

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;
}

猜你喜欢

转载自blog.csdn.net/miranda_ymz/article/details/81076016