题意: 给你n*n的图,判断是不是满足任意两点都是最短路,满足的话输出所有的最短路径和。
一开始写的时候想错方向了,求了1~n最短路。。。。。。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
const int maxm = 200005;
ll cost[maxn][maxn];
int n;
ll Floyd(int n)/*贪心迭代*/
{
int i,j,k;
long long ans = 0;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++){
int flag = 1;
for(k=1;k<=n;k++){
if(cost[i][k] + cost[k][j] < cost[i][j]) {
puts("-1");
return 0;
}
else if(i != k && j != k && cost[i][j] == cost[i][k] + cost[k][j]) {
flag = 0;
}
}
if(flag) ans += cost[i][j];
}
return ans;
}
int main()
{
while(~scanf("%d", &n)) {
int a;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%lld", &a);
cost[i][j] = a;
}
}
ll ans = Floyd(n);
if(ans) {
printf("%lld\n", ans);
}
}
return 0;
}