• I


    题目链接:

    I - Induced Metric Space

     Gym - 102190I 

    题目大意:首先是T组测试样例,然后给你一个n*n的矩阵,然后a[i][j]代表i到j的距离是a[i][j]。然后-1代表当前的点的距离不知道,让你填空。要求自己到自己距离是0,a[i][j]=a[j][i]。a[i][j]为i到j的最短距离。

    具体思路:前面是一堆非法情况的判断。然后floyed求最短路,如果当前的点是固定的值并且还可以松弛,那么就是非法的。注意数据范围

    floyed竟然打错了。。

    AC代码:

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 # define ll long long
      4 # define LL_inf 1e9
      5 const int maxn = 2e5+100;
      6 const int N = 500+100;
      7 int  a[N][N];
      8 int vis[N][N];
      9 int n,flag;
     10 void floyed()
     11 {
     12     for(int i=1; i<=n; i++)
     13     {
     14         for(int j=1; j<=n; j++)
     15         {
     16             for(int k=1; k<=n; k++)
     17             {
     18                 if(!vis[j][k]&&a[j][k]>a[j][i]+a[i][k])
     19                 {
     20                     flag=0;
     21                 }
     22                 a[j][k]=min(a[j][k],a[j][i]+a[i][k]);
     23             }
     24         }
     25     }
     26 }
     27 int main()
     28 {
     29     int T;
     30     scanf("%d",&T);
     31     while(T--)
     32     {
     33         flag=1;
     34         memset(vis,0,sizeof(vis));
     35         scanf("%d",&n);
     36         for(int i=1; i<=n; i++)
     37         {
     38             for(int j=1; j<=n; j++)
     39             {
     40                 scanf("%d",&a[i][j]);
     41                 if(a[i][j]==-1)
     42                     vis[i][j]=1;
     43             }
     44         }
     45         for(int i=1; i<=n; i++)
     46         {
     47             if(a[i][i]==-1)
     48                 a[i][i]=0,vis[i][i]=0;
     49             if(a[i][i]!=0)
     50             {
     51                 flag=0;
     52                 break;
     53             }
     54         }
     55         for(int i=1; i<=n; i++)
     56         {
     57             for(int j=i; j<=n; j++)
     58             {
     59                 if(a[i][j]==-1&&a[j][i]!=-1)
     60                 {
     61                     a[i][j]=a[j][i];
     62                     vis[i][j]=0;
     63                 }
     64                 if(a[i][j]!=-1&&a[j][i]==-1)
     65                 {
     66                     a[j][i]=a[i][j];
     67                     vis[j][i]=0;
     68                 }
     69                 if(a[i][j]!=a[j][i])
     70                 {
     71                     flag=0;
     72                     break;
     73                 }
     74             }
     75             if(!flag)
     76                 break;
     77         }
     78         if(!flag)
     79             printf("NO
    ");
     80         else
     81         {
     82             for(int i=1; i<=n; i++)
     83             {
     84                 for(int j=1; j<=n; j++)
     85                 {
     86                     if(vis[i][j]==0)
     87                         continue;
     88                     a[i][j]=LL_inf;
     89                 }
     90             }
     91             floyed();
     92             for(int i=1; i<=n; i++)
     93             {
     94                 for(int j=1; j<=n; j++)
     95                 {
     96                     if(a[i][j]!=a[j][i])
     97                     {
     98                         flag=0;
     99                         break;
    100                     }
    101                 }
    102                 if(!flag)
    103                     break;
    104             }
    105             if(!flag)
    106                 printf("NO
    ");
    107             else
    108             {
    109                 printf("YES
    ");
    110                 for(int i=1; i<=n; i++)
    111                 {
    112                     for(int j=1; j<=n; j++)
    113                     {
    114                         if(j==1)
    115                             printf("%d",a[i][j]);
    116                         else
    117                             printf(" %d",a[i][j]);
    118                     }
    119                     printf("
    ");
    120                 }
    121             }
    122         }
    123     }
    124     return 0;
    125 }
  • 相关阅读:
    css 超出两行省略号,超出一行省略号
    css 去掉i标签默认斜体样式
    Spring 使用单选按钮
    Spring Maven工程引入css,js
    Sping 补充完成修改功能
    Spring 控制器层如何启用验证?
    Spring 控制器层如何调用DAO层
    spring boot工程如何启用 热启动功能
    Spring 视图层如何显示验证消息提示
    Sping POJO中如何添加验证规则和验证消息提示
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10801756.html
Copyright © 2020-2023  润新知