HDU 6187 Destroy Walls(最大生成树+Kruskal)

 

 给出 n 个城市的坐标 xi,yi,有 m 个城墙,第 ui 个城市和第 vi 个城市之间是一道城墙,破坏该城墙需要 wi 的花费,问使得整个图中无环的最小花费

向反方向考虑,使得剩余城墙数量尽量的多,且剩余城墙破坏价值尽量的大,求该图的最大生成树​​​​​​​ 

const int N=2e5+5;
 
    int n,m,t;
    int i,j,k;
    int fa[N];
struct node
{
    int u,v,w;
    bool operator<(node &b){
        return w>b.w;
    }
}G[N];

int Find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=Find(fa[x]);
}
int main()
{
    //IOS;
    while(sdd(n,m)==2){
        int x,y,sum=0;
        for(i=1;i<=n;i++) sdd(x,y);
        for(i=1;i<=m;i++){
            sdd(G[i].u,G[i].v);
            sd(G[i].w);
            sum+=G[i].w;
        }
        sort(G+1,G+1+m);
        for(i=1;i<=n;i++) fa[i]=i;
        int ans=0,num=0;
        for(i=1;i<=m;i++){//枚举那些留着
            int u=G[i].u;
            int v=G[i].v;
            int w=G[i].w;
            u=Find(u);
            v=Find(v);
            if(u==v) continue;
            ans+=G[i].w;
            num++;
            fa[u]=v;            
        }
        pdd(m-num,sum-ans);
    }
    return 0;
    //PAUSE;
}

 

 

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/107815717