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

[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;
}

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

时间: 2024-10-13 18:41:45

[Arc083D/At3535] Restoring Road Network - 最短路,结论的相关文章

Restoring Road Network

D - Restoring Road Network 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

AtCoder Regular Contest 083 D:Restoring Road Network

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

Restoring Road Network(Floyd算法的推广)

个人心得:看懂题目花费了不少时间,后面实现确实时间有点仓促了,只是简单的做出了判断是否为真假的情况, 后面看了题解发现其实在判断时候其实能够一起解决的,算了,基础比较差还是慢慢的来吧. 题意概述: 就是给定一个N阶方阵,规定Auv,为u到v的最短路径,若给出的数据存在其他通路少于此时的值则不存在即为假, 解决方法就是利用Floyd算法进行单源最短路的判断,只要后面的矩阵与原来的不相符就是假的.真的的时候,是要求 存在的最短总路程使得矩阵的数成立,我画了下就是只要存在从其他城市能够转到目的地的时候

AtCoder Beginner Contest 074 D - Restoring Road Network(Floyd变形)

题目链接:点我点我 题意:给出一个最短路的图,询问是否正确,如果正确的话,输出遍历所有点的最短路径和. 题解:判断是否正确的,直接再一次Floyd,判断是否会有A[i][k]+A[k][j]<A[i][j](通过中间点k使得两点间距离更短),如果有的话,直接输出-1. 要遍历到所有道路,并且路径和最小,我们可以尽可能用用中间点的路径(A[i][k]+A[k][j]==A[i][j]),这样本来遍历两个点,就可以遍历3个点了, 最后加的时候记得不要从重复加,从最小点往后加,不要再往前加,不然就重复

【Atcoder】ARC083 D - Restoring Road Network

[算法]图论,最短路? [题意]原图为无向连通图,现给定原图的最短路矩阵,求原图最小边权和,n<=300. [题解]要求最小边权和下,原图的所有边一定是所连两端点的最短路. 那么现在将所有最短路作为边加入原图,考虑删边. 对于(u,v),若存在点w使得(u,v)=(u,w)+(w,v),则(u,v)可以删去.(btw,若是>则无解) 复杂度O(n^3). #include<cstdio> #include<cstring> #include<cctype>

杭电 1596 find the safest road (最短路)

http://acm.hdu.edu.cn/showproblem.php?pid=1596 这道题目与杭电2544最短路的思想是一样的,只不过是把+改成了*,输入输出有些不一样而已. find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6985    Accepted Submission(s)

hdu 1596 find the safest road(乘积最短路)

题目: 链接:点击打开链接 题意: 思路: 对dijkstra稍作修改即可,每次更新dis[]时改为乘积. 代码: #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define INF 100000000 const int N = 1010; int n,m; double map[N][N],dis[N]; int st,ed; void dijkstra(

HDU5669 Road 分层最短路+线段树建图

分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ?的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维护整个图, 连边时候找到对应区间,把线段树的节点之间连边.这样可以大大缩减边的规模,然后再跑分层图最短路就可以了. 但是这样建图,每一次加边都要在O(logn)个线段树节点上加边,虽然跑的非常快,但是复杂度仍然是不科学的. 为了解决边的规模的问题,开两棵线段树,连边时候可以新建一个中间节点,在对应区

AOJ-2249 Road Construction(最短路)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45523 有一个国王想在首都与各个城市之间修建公路,但是他的预算太高,所以必须要降低预算. 为了降低预算,必须要有新计划,新计划必须满足每两个城市都连通,首都和城市的最短距离不会改变两个条件. 输入N各城市,首都标号为1,m条路,m行每行四个数,u,v,d,c;表示u跟v联通,并且距离为d,修路花费为c. 输出最小花费. 首先从首都开始求出到每个城市的最短路,然后再满足最短距