zoukankan      html  css  js  c++  java
  • 1709. PenguinAvia 夜

    此题使用并查集

    将多余的航班删去(有环时)  少的航班加上 使得全图联通

    答案不唯一 所以自己写的和题中实例输出不一样也不一定错

    还有就是花费最大会超过 long 所以直接用 64位

    http://acm.timus.ru/problem.aspx?space=1&num=1709

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>

    using namespace std;

    char ans[101][101];
    int f[101];
    inline int find(int x)//这个你懂得
    {
        if(f[x]!=x)
        f[x]=find(f[x]);
        return f[x];
    }
    int main()
    {
        //freopen("D:\\6\\bin\\Debug\\hu.txt","r",stdin);
        int n,d,a,i,j,l1,l2;
        char k;
        long long pay;
        cin>>n>>d>>a;
        for(i=1;i<=n;i++)
        f[i]=i;
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        ans[i][j]='0';
        pay=0;
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            cin>>k;
            if(k=='1'&&i<j)
            {
               l1=find(i);l2=find(j);
               if(l1==l2)//有环 删掉
               {ans[i][j]=ans[j][i]='d';pay+=d;}
               else
               f[l1]=l2;//没有环 使联通
            }
        }
        for(i=2;i<=n;i++)//将少的航班加上 (不唯一)
        if(find(i)!=find(1))
        {
            ans[i][1]=ans[1][i]='a';
            f[find(i)]=find(1);
            pay+=a;
        }
        cout<<pay<<endl;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            cout<<ans[i][j];
            cout<<endl;
        }
        return 0;
    }

  • 相关阅读:
    Codeforces Round #174 (Div. 1 + Div. 2)
    Codeforces Round #176 (Div. 1 + Div. 2)
    [ARC101C] Ribbons on Tree 解题报告
    [CTS2019]珍珠 解题报告
    CF1349D Slime and Biscuits 解题报告
    [PKUWC2018]猎人杀 解题报告
    AGC047 解题报告
    肯德基 解题报告
    [GXOI/GZOI2019]旧词 解题报告
    [ARC084B] Small Multiple 解题报告
  • 原文地址:https://www.cnblogs.com/liulangye/p/2261922.html
Copyright © 2011-2022 走看看