zoukankan      html  css  js  c++  java
  • 1366 贫富差距

    一个国家有N个公民,标记为0,1,2,...,N-1,每个公民有一个存款额。已知每个公民有一些朋友,同时国家有一条规定朋友间的存款额之差不能大于d。也就是说,a和b是朋友的话,a有x元的存款,b有y元,那么|x-y|<=d。给定d值与N个人的朋友关系,求这个国家最富有的人和最贫穷的人的存款相差最大的可能值是多少?即求贫富差距的最大值的下界。若这个值为无穷大,输出-1.

    Input
    多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
    每组测试数据有相同的结构构成。
    每组数据的第一行两个整数N,d,表示人数与朋友间存款差的最大值,其中2<=N<=50,0<=d<=1000.
    接下来有一个N*N的数组A,若A[i][j]='Y'表示i与j两个人是朋友,否则A[i][j]='N'表示不是朋友。其中A[i][i]='N',且保证
    A[i][j]=A[j][i].
    Output
    每组数据一行输出,即这个国家的贫富差距最大值的下界,如果这个值为无穷大输出-1.
    Input示例
    3
    3 10
    NYN
    YNY
    NYN
    2 1
    NN
    NN
    6 1000
    NNYNNN
    NNYNNN
    YYNYNN
    NNYNYY
    NNNYNN
    NNNYNN
    Output示例
    20
    -1
    3000
    思路:2个人之间的贫富差距即两个人之间的最短路*d,所以跑一遍floyd
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 1e9
     4 const int N=55;
     5 
     6 int e[N][N];
     7 int A[N][N],p[N][N];
     8 char s[N][N];
     9 
    10 int n,d;
    11 
    12 void init(){
    13     for(int i=1;i<=N;i++)
    14         for(int j=1;j<=N;j++) e[i][j]=INF;
    15     for(int i=1;i<=N;i++) e[i][i]=0;
    16 }
    17 
    18 void floyd(){
    19     for(int i=1;i<=n;i++) {
    20         for(int j=1;j<=n;j++) {
    21             A[i][j]=e[i][j];
    22             if(i!=j&&A[i][j]<INF) p[i][j]=i;
    23             else p[i][j]=-1;
    24         }
    25     }
    26     for(int k=1;k<=n;k++){
    27         for(int i=1;i<=n;i++){
    28             for(int j=1;j<=n;j++){
    29                 if(k==i||k==j) continue;
    30                 if(A[i][k]+A[k][j]<A[i][j]){
    31                     A[i][j]=A[i][k]+A[k][j];
    32                     p[i][j]=p[k][j];
    33                 }
    34             }
    35         }
    36     }
    37 }
    38 int main(){
    39     int t;
    40     scanf("%d",&t);
    41     while(t--){
    42         init();
    43         scanf("%d%d",&n,&d);
    44         for(int i=1;i<=n;i++){
    45             scanf("%s",s[i]+1);
    46             for(int j=1;j<=n;j++){
    47                 if(s[i][j]=='Y') e[i][j]=1;
    48             }
    49         }
    50         floyd();
    51         int Max=0;
    52         for(int i=1;i<=n;i++){
    53             for(int j=1;j<=n;j++){
    54                 Max=max(Max,A[i][j]);
    55             }
    56         }
    57         if(Max==1e9) printf("-1
    ");
    58         else
    59         cout<<Max*d<<endl;
    60     }
    61     return 0;
    62 }
  • 相关阅读:
    【BZOJ】1486 [HNOI2009]最小圈
    【网络流24题】
    【网络流24题】魔术球问题
    【网络流24题】最小路径覆盖问题
    【BZOJ】1026 [SCOI2009]windy数
    【SPOJ】2319 BIGSEQ
    【SPOJ】1182 Sorted bit sequence
    虔诚的墓主人(bzoj 1227)
    Round Numbers(poj 3252)
    windy数(bzoj 1227)
  • 原文地址:https://www.cnblogs.com/hhxj/p/7121002.html
Copyright © 2011-2022 走看看