D

原题地址:http://abc074.contest.atcoder.jp/tasks/arc083_b

Time limit : 2sec / Memory limit : 256MB

Score : 500 points

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 ij1≤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

Copy
3
0 1 3
1 0 2
3 2 0

Sample Output 1

Copy
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

Copy
3
0 1 3
1 0 1
3 1 0

Sample Output 2

Copy
-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

Copy
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

Copy
82

Sample Input 4

Copy
3
0 1000000000 1000000000
1000000000 0 1000000000
1000000000 1000000000 0

Sample Output 4

Copy
3000000000
题目意思:有一张地图上面标志着每个点之间最短路的大小;判断总路程;如果最短路和地图不符合就输出-1;
解题思路:Floyd算法,如果两点之间进行了中转就记录;最后遍历判断,把所有没有经过中转的路相加;
代码:
#include<iostream>
#include<string>
#include<algorithm>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <set>
#include <queue>
#include <stack>
#include <map>
 
using namespace std;
typedef long long LL;
const int MAX = 330;
 
int visit[MAX][MAX]={0};
LL Map1[MAX][MAX];
LL Map[MAX][MAX];
int N;
 
int main()
{
    cin>>N;
    for(int i = 1;i<=N;i++)
    for(int j = 1;j<=N;j++)
    {
        cin>>Map[i][j];
        Map1[i][j] = Map[i][j];
    }
    for(int k = 1;k<=N;k++)
        for(int i = 1;i<=N;i++)
            for(int j = 1;j<=N;j++){
                if(Map[i][j]>=Map[i][k]+Map[k][j]&&(i!=k&&j!=k)){
                    //cout<<i<<" "<<j<<" "<<k<<endl;
                    Map1[i][j] = Map[i][k]+Map[k][j];
                    visit[i][j] = 1;
                }
            }
 
    LL sum = 0;
    for(int i = 1;i<N;i++){
        for(int j = i+1;j<=N;j++)
        {
            if(Map[i][j]!=Map1[i][j]){
                 cout<<"-1"<<endl;
                 return 0;
            }
            if(Map[i][j]==Map1[i][j]&&visit[i][j]!=1)
                sum+=Map[i][j];
 
        }
    }
    if(sum==0)
        cout<<-1<<endl;
    else
        cout<<sum<<endl;
 
 
    return 0;
}


 
原文地址:https://www.cnblogs.com/a2985812043/p/7749296.html