zoukankan      html  css  js  c++  java
  • Ural 1416 Confidential

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

    又是次小生成树啊。

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 using namespace std;
     5 #define maxn 505
     6 #define inf (int)(1<<31-1)
     7 int s[maxn][maxn],f[maxn][maxn],lowcost[maxn],closest[maxn],flag;
     8 void init(int n)
     9 {
    10     for(int i=1;i<=n;i++)
    11     for(int j=1;j<=n;j++){
    12         f[i][j]=-inf;
    13         s[i][j]=inf;
    14     }
    15 }
    16 int mst(int n)
    17 {
    18     int k,ans=0;
    19     for(int i=1;i<=n;i++){
    20         lowcost[i]=s[1][i];
    21         closest[i]=1;
    22     }
    23     lowcost[1]=-1;
    24     for(int i=1;i<n;i++){
    25         int min=inf;
    26         for(int j=1;j<=n;j++)
    27         if(lowcost[j]!=-1&&min>lowcost[j]){
    28             min=lowcost[j];
    29             k=j;
    30         }
    31         if(min==inf)
    32         flag=1;
    33         ans+=min;
    34         //printf("%d**
    ",ans);
    35         for(int j=1;j<=n;j++)
    36         if(lowcost[j]==-1){
    37             f[j][k]=max(f[j][closest[k]],lowcost[k]);
    38             f[k][j]=f[j][k];
    39         }
    40         lowcost[k]=-1;
    41         s[closest[k]][k]=inf;
    42         s[k][closest[k]]=inf;
    43         for(int j=1;j<=n;j++)
    44         if(lowcost[j]!=-1&&lowcost[j]>s[k][j]){
    45             lowcost[j]=s[k][j];
    46             closest[j]=k;
    47         }
    48     }
    49     return ans;
    50 }
    51 int deal(int n)
    52 {
    53     int ans=inf;
    54     for(int i=1;i<=n;i++)
    55     for(int j=1;j<=n;j++)
    56     if(s[i][j]!=inf)
    57     ans=min(ans,s[i][j]-f[i][j]);
    58     return ans;
    59 }
    60 int main()
    61 {
    62     int n,m;
    63     while(~scanf("%d%d",&n,&m)){
    64         init(n);
    65         while(m--){
    66             int a,b,c;
    67             scanf("%d%d%d",&a,&b,&c);
    68             s[a][b]=c;
    69             s[b][a]=c;
    70         }
    71         flag=0;
    72         int ans=mst(n);
    73         if(flag==1){
    74             printf("Cost: -1
    Cost: -1
    ");
    75             continue;
    76         }
    77         int s1=deal(n);
    78         if(s1==inf){
    79             printf("Cost: %d
    Cost: -1
    ",ans);
    80         }
    81         else
    82         printf("Cost: %d
    Cost: %d
    ",ans,ans+s1);
    83     }
    84     return 0;
    85 }
    AC Code
  • 相关阅读:
    安装minikube
    【知识总结】预训练语言模型BERT的发展由来
    【爬虫】批量下载极客时间课程
    【Python】中国有哪些同名的省市县?
    【笔记】Java函数式编程
    【linux】没有root权限如何通过apt安装软件
    Flink命令行提交job
    MybatisPlus QueryWrapper
    MybatisPlus逻辑删除
    MybatisPlus分页操作
  • 原文地址:https://www.cnblogs.com/kim888168/p/3189905.html
Copyright © 2011-2022 走看看