码迷,mamicode.com
首页 > Web开发 > 详细

[Arc083D/At3535] Restoring Road Network - 最短路,结论

时间:2020-02-06 14:36:39      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:for   结果   name   work   ring   根据   mat   cout   sig   

[Arc083D/At3535]

\(N\) 个城市,城市与城市之间用长度为整数的无向道路连接。

现有一考古学家找到了一张 \(N×N\) 的表 \(A\) ,这张表代表了这 \(N\) 座城市两两之间的最短路。即表中的第 \(u\) 行第 \(v\)列的值代表了从城市 \(u\)\(v\)的最短路长度。

问能否根据这张表,求出高桥王国的最小道路长度总和。

——————————

考虑到原图中的边一定就在这个最短路矩阵中,我们只需要保留其中的一些,让它们“表示”出其它就可以了

那么我们是否可以将最短路矩阵看成图,所有“冗余”边删掉,就得到了结果呢?

猜得这样得出的结果就是最优的

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 305;
int n,g[305][305],ans;

signed main() {
    cin>>n;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            cin>>g[i][j];
            ans+=g[i][j];
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            for(int k=1;k<=n;k++) {
                if(i==j) continue;
                if(j==k) continue;
                if(k==i) continue;
                if(g[i][j] > g[i][k]+g[k][j]) {
                    cout<<-1;
                    return 0;
                }
                if(g[i][j] == g[i][k]+g[k][j]) {
                    ans-=g[i][j];
                    break;
                }
            }
        }
    }
    cout<<ans/2ll<<endl;
}

[Arc083D/At3535] Restoring Road Network - 最短路,结论

标签:for   结果   name   work   ring   根据   mat   cout   sig   

原文地址:https://www.cnblogs.com/mollnn/p/12268400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!