zoukankan      html  css  js  c++  java
  • HDU 2860 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=2860

    n个旅,k个兵,m条指令

    AP 让战斗力为x的加入y旅

    MG x旅y旅合并为x旅

    GT 报告x旅的战斗力

    几个需要注意的小问题是:已经被合并过的不能再参加合并这样就简化了并查集本身的复杂度只存在一层继承关系

    一道简单的并查集题目,一开始不知道什么情况总是PE,格式上找不到错23333

    后来参考了潘大神的代码,原来是最后回车的位置粗了偏擦23333

    #include<stdio.h>
    #define inf 0x3f3f3f3f
    int par[200000];
    int miner[200000];
    int min(int a,int b)
    {
        if(a>b){return b;}
        else return a;
    }
    void atfirst(int n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            par[i]=i;
            miner[i]=inf;
        }
    }
    int find(int x)
    {
        return x!=par[x]?par[x]=find(par[x]):x;
    }
    int main()
    {
        int i,k,n,m;
        int r,c;
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
        while(scanf("%d%d%d",&n,&k,&m)!=EOF)
        {
            atfirst(n);
            for(i=1;i<=k;i++)
            {
                scanf("%d%d",&r,&c);
                miner[c]=min(r,miner[c]);
            }
            for(i=1;i<=m;i++)
            {
                char donser[5];
                scanf("%s",&donser);
                if(donser[0]=='A')
                {
                    scanf("%d%d",&r,&c);
                    if(par[c]!=c){printf("Reject
    ");continue;}
                    miner[c]=min(r,miner[c]);
                    printf("Accept
    ");
                }
                if(donser[0]=='M')
                {
                    scanf("%d%d",&r,&c);
                    if(r==c){printf("Reject
    ");continue;}
                    if(par[r]==r&&par[c]==c)
                    {
                        par[c]=r;
                        miner[r]=min(miner[r],miner[c]);
                        printf("Accept
    ");
                    }
                    else printf("Reject
    ");
                }
                if(donser[0]=='G')
                {
                    scanf("%d",&r);
                    if(par[r]==r&&miner[r]!=inf)
                        printf("Lowest rate: %d.
    ",miner[r]);
                    else if(par[r]==r&&miner[r]==inf)
                        printf("Company %d is empty.
    ",r);
                    else
                    {
                        printf("Company %d is a part of company %d.
    ",r,find(r));
                    }
                }
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    Swift相比OC语言有哪些优点
    Swift实战技巧
    Swift 并行编程现状和展望
    Swift设置只读(readOnly)属性
    Swift零基础教程2019最新版(一)搭建开发环境
    中文版 Apple 官方 Swift 教程《The Swift Programming Language》
    一个中文的苹果开发站
    simulink创建简单模型
    Simulink 产品说明
    matlab中的实时音频
  • 原文地址:https://www.cnblogs.com/dzzy/p/5217582.html
Copyright © 2011-2022 走看看