Restoring Road Network (Floyed)

Problem Statement

 

In Takahashi Kingdom, which once existed, there are N

cities, and some pairs of cities are connected bidirectionally by roads. The following are known about the road network:

  • People traveled between cities only through roads. It was possible to reach any city from any other city, via intermediate cities if necessary.
  • Different roads may have had different lengths, but all the lengths were positive integers.

Snuke the archeologist found a table with N

rows and N columns, A

, in the ruin of Takahashi Kingdom. He thought that it represented the shortest distances between the cities along the roads in the kingdom.

Determine whether there exists a road network such that for each u

and v, the integer Au,v at the u-th row and v-th column of A is equal to the length of the shortest path from City u to City v

. If such a network exist, find the shortest possible total length of the roads.

Constraints

 

  • 1≤N≤300
  •  
  • If i≠j
  • , 1≤Ai,j=Aj,i≤109
  • .
  • Ai,i=0
  •  

Inputs

 

Input is given from Standard Input in the following format:

N
A1,1
 A1,2
 ...
 A1,N
A2,1
 A2,2
 ...
 A2,N
...
AN,1
 AN,2
 ...
 AN,N
 

Outputs

 

If there exists no network that satisfies the condition, print -1. If it exists, print the shortest possible total length of the roads.

Sample Input 1

 

3
0 1 3
1 0 2
3 2 0

Sample Output 1

 

3

The network below satisfies the condition:

  • City 1

and City 2 is connected by a road of length 1

  • .
  • City 2
  • and City 3 is connected by a road of length 2
  • .
  • City 3
  • and City 1
    • is not connected by a road.

    Sample Input 2

     

    3
    0 1 3
    1 0 1
    3 1 0
    

    Sample Output 2

     

    -1
    

    As there is a path of length 1

    from City 1 to City 2 and City 2 to City 3, there is a path of length 2 from City 1 to City 3. However, according to the table, the shortest distance between City 1 and City 3 must be 3

    .

    Thus, we conclude that there exists no network that satisfies the condition.

    Sample Input 3

     

    5
    0 21 18 11 28
    21 0 13 10 26
    18 13 0 23 13
    11 10 23 0 17
    28 26 13 17 0
    

    Sample Output 3

     

    82
    

    Sample Input 4

     

    3
    0 1000000000 1000000000
    1000000000 0 1000000000
    1000000000 1000000000 0
    

    Sample Output 4

     

    3000000000
    
//#pragma GCC optimize(2)
//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
using namespace std;
typedef long long ll;
inline bool read(ll &num)
{char in;bool IsN=false;
in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
const int N=300+5;

    ll n,m,t,_;
    int i,j,k;
    ll a[N];
    ll p[N][N];
    bool flag;

int main()
{
    for(;read(n);){
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                read(p[i][j]);
                p[j][i]=p[i][j];
            }
        }

        ll ans=0;
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                flag=1;
                for(k=1;k<=n;k++){
                    if(i==j || j==k || k==i) continue;

                    if(p[i][j]>p[i][k]+p[k][j]){
                        puts("-1");
                        return 0;
                    }
                    else
                    if(p[i][j]==p[i][k]+p[k][j])
                        flag=0;
                }

                if(flag) ans+=p[i][j];//人们想去中间城市,所以去掉p[i][j]直通路
            }
        }

        cout<<ans/2<<endl;//i,j都是从1---n遍历,谁都可以是终点,谁都可以是起点
    }
    return 0;
}
原创文章 410 获赞 16 访问量 3万+

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/106099716