zoukankan      html  css  js  c++  java
  • BZOJ 3624 并查集 (Kruskal)

    思路:
    先把所有能加上的水泥路都加上 判断哪些是必加的鹅卵石路

    再重新做一遍最小生成树
    加上必加的鹅卵石路 一直加鹅卵石路 判一下是不是=k
    最后加上水泥路就好了

    //By SiriusRen
    #include <cstdio>
    using namespace std;
    const int N=100050;
    int n,m,k,f[N],top;
    struct Node{int u,v,c;}node[N],ans[N];
    int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
    bool merge(int x,int y){
        int fx=find(x),fy=find(y);
        if(fx!=fy){f[fx]=fy;return 1;}
        return 0;
    }
    int main(){
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)f[i]=i;
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].c);
        for(int i=1;i<=m;i++)if(node[i].c)merge(node[i].u,node[i].v);
        for(int i=1;i<=m;i++)if(!node[i].c)if(merge(node[i].u,node[i].v))ans[++top]=node[i];
        for(int i=1;i<=n;i++)f[i]=i;
        for(int i=1;i<=top;i++)merge(ans[i].u,ans[i].v);
        for(int i=1;i<=m;i++)if(!node[i].c&&top<k)if(merge(node[i].u,node[i].v))ans[++top]=node[i];
        if(top!=k){puts("no solution");return 0;}
        for(int i=1;i<=m;i++)if(node[i].c)if(merge(node[i].u,node[i].v))ans[++top]=node[i];
        for(int i=1;i<=top;i++)printf("%d %d %d
    ",ans[i].u,ans[i].v,ans[i].c);
    }

    这里写图片描述

  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532055.html
Copyright © 2011-2022 走看看