• BZOJ 3624 Apio2008 免费道路


    3624: [Apio2008]免费道路

    Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special Judge
    Submit: 1709  Solved: 694
    [Submit][Status][Discuss]

    Description

    Input

    Output

    Sample Input

    5 7 2
    1 3 0
    4 5 1
    3 2 0
    5 3 1
    4 3 0
    1 2 1
    4 2 1

    Sample Output

    3 2 0
    4 3 0
    5 3 1
    模拟+并查集
    最后如果有解的话,那么所有的道路会构成一棵树
    首先确定哪些鹅卵石路必须选,然后判断是否大于k,如果大于则是no solution
    然后包含必须选的鹅卵石路选择k条,最后确定水泥路
    还有如果鹅卵石路本来就小于k的话也是no solution
    #include <bits/stdc++.h>
    #define ll long long
    #define inf 100000000
    using namespace std;
    inline int read(){
        int x=0;int f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int MAXN=1e6+10;
    int f[MAXN];
    int u[MAXN],v[MAXN],c[MAXN],n,m,au[MAXN],ac[MAXN],num[3],av[MAXN],top,ans,vis[MAXN];
    inline int find(int xx){
        return xx==f[xx]?xx:f[xx]=find(f[xx]);
    }
    inline void solve(int ine,int mx){
        for(int i=1;i<=m;i++){
            if(c[i]==ine&&num[ine]<mx){
                int fx=find(u[i]);int fy=find(v[i]);
                if(fx!=fy){
                    vis[i]=1;f[fx]=fy;num[ine]++;
                    au[++top]=u[i];av[top]=v[i];ac[top]=c[i];
                }
            }
        }
    }
    int main(){
        //freopen("All.in","r",stdin);
        //freopen("zh.out","w",stdout);
        n=read();m=read();int k=read();
        for(int i=1;i<=m;i++){
            u[i]=read();v[i]=read();c[i]=read();
        }
        for(int i=1;i<=n;i++) f[i]=i;
        solve(1,inf);solve(0,inf);
        if(num[1]+num[0]!=n-1||num[0]>k){
            cout<<"no solution"<<endl;
            return 0;
        }
        top=0;num[0]=num[1]=0;
        for(int i=1;i<=n;i++) f[i]=i;
        for(int i=1;i<=m;i++){
            if(vis[i]&&c[i]==0){
                int fx=find(u[i]);
                int fy=find(v[i]);
                if(fx!=fy){
                    au[++top]=u[i];av[top]=v[i];ac[top]=c[i];
                    num[0]++;f[fx]=fy;
                }
            }
        }
        solve(0,k);solve(1,inf);
        if(num[0]<k){
            cout<<"no solution"<<endl;
            return 0;
        }
        for(int i=1;i<=top;i++){
            printf("%d %d %d
    ",au[i],av[i],ac[i]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    VS2019 技巧
    html5-Canvas
    JS动画三剑客——setTimeout、setInterval、requestAnimationFrame
    C# 从1到Core--委托与事件
    ILSpy工具使用
    .NET 表达式计算:Expression Evaluator
    jQuery.globalEval()方法
    jquery的eval的使用
    js中的eval方法
    设计模式速查手册
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/8073116.html
Copyright © 2020-2023  润新知