【SSL 1588】猜道路(图论)
创始人
2024-01-28 20:07:06
0

猜道路

题目链接:SSL 1588

题目大意

给你 n 个点之间的最短路径,要你找到原来图上路径的总长度最短可以是多少,如果没有满足的图则输出 -1。

思路

首先至于判断满足这个很简单,因为只有图是满足是最短路的一定能构造。
所以你只需要判一下是否存在 ai,j>ai,k+a−k,ja_{i,j}>a_{i,k}+a-{k,j}ai,j​>ai,k​+a−k,j 这样的不合法情况即可。

那考虑构造,会发现其实生成树并不对,因为你完全没必要走树上的,可以开一条捷径之类的。
所以我们考虑一个条边怎样才不需要。
那就是它可以被替代,也就是存在 ai,k+ak,j=ai,ja_{i,k}+a_{k,j}=a_{i,j}ai,k​+ak,j​=ai,j​ 的时候,ai,ja_{i,j}ai,j​ 就不被需要了。

那你把剩下需要的边的边权加起来,就是答案了。

代码

#include
#include
#define ll long long using namespace std;const int N = 305;
int n, a[N][N], fa[N];int main() {scanf("%d", &n);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) {scanf("%d", &a[i][j]);}for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (i != j && i != k && j != k) {if (a[i][j] > a[i][k] + a[k][j]) {printf("-1"); return 0;}}ll ans = 0;for (int i = 1; i <= n; i++)for (int j = i + 1; j <= n; j++)if (i != j) {bool in = 1;for (int k = 1; k <= n; k++) if (k != i && k != j)if (a[i][j] == a[i][k] + a[k][j]) {in = 0; break;}if (in) ans += a[i][j];}printf("%lld", ans);return 0;
}

相关内容

热门资讯

唯品会真假护肤品混合售卖是真的...   淘宝、京东、拼多多的大力发展之下,唯品会也不甘于后,甚至也以专卖品牌打折商品为主以此来吸引大家的...
闪电贷需要什么条件才能通过?闪...   闪电贷是招行旗下的信贷产品,很受大家喜欢,都会有需要钱的时候,每个平台能申请的规则也是不一样,有...
天津现代和美医院是正规医院吗?...   近几年来,随着医疗科技的进步,很多疑难杂症也渐渐得以改善,但与此同时,也衍生出了更多的医院,前有...
生日宴推荐12个家常菜,过生日...   一年中每个人都会过一次生日,生日这天你是最大的,这时候亲朋好友就会来给你过生日,当然也不能怠慢给...
正规的网贷平台有哪些?国家承认...   虽然人们都知道欠债还钱是天经地义的,但是也只有真正体会过手头上没有任何资金可以周转,需要寻找各种...
生日宴推荐12个家常菜,过生日...   一年中每个人都会过一次生日,生日这天你是最大的,这时候亲朋好友就会来给你过生日,当然也不能怠慢给...
天津现代和美医院是正规医院吗?...   近几年来,随着医疗科技的进步,很多疑难杂症也渐渐得以改善,但与此同时,也衍生出了更多的医院,前有...
生日宴推荐12个家常菜,过生日...   一年中每个人都会过一次生日,生日这天你是最大的,这时候亲朋好友就会来给你过生日,当然也不能怠慢给...
正规的网贷平台有哪些?国家承认...   虽然人们都知道欠债还钱是天经地义的,但是也只有真正体会过手头上没有任何资金可以周转,需要寻找各种...
全民k歌怎么赚钱提现?全民K歌...   全民K歌是一款非常熟悉的软件,下载全民k歌就可以在上面唱歌赚钱,唱歌好的话也可以开直播,这样粉丝...