Atcoder 083 Restoring Road Network(类弗洛伊德)
来源:互联网 发布:朝鲜扫码软件 编辑:程序博客网 时间:2024/06/02 04:26
题目链接
题意
一共有N个城市,通过N-1条边连接。
现在给出一个N x N的矩阵,表示从i->j的最短路径,求能否根据这个N x N的矩阵求出最短路,如果最短路出错,输出-1
解决
k /\ / \ i /____\ j
- 因为N只有300级别,所以可以n^3算法
- 设三个点 i , j ,k
- 如果存在i->k + k->j的最短路径和< i->j的最短距离,那么这个矩阵是错误的。
- 如果存在i->k + k->j的最短路径和= i->j的最短距离,那么i->j的这条边是不需要存在的(走同样的路程,能通过更多的点(k点),所以选择i->k->j而不是i->j)
#include<bits/stdc++.h>using namespace std;int maps[305][305];bool flag[305][305];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&maps[i][j]); } } bool ok = true; 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(i==k) continue; if(j==k) continue; if(maps[i][k]+maps[k][j] < maps[i][j]) ok = false; //存在比“最短路”更短的路,错误 if(maps[i][k]+maps[k][j] == maps[i][j]) flag[i][j] = flag[j][i] = 1; //从i到j的边是不需要存在的 } } } if(!ok){ puts("-1"); return 0; } long long ans = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) continue; if(flag[i][j]) continue; //不需要存在的路 ans += maps[i][j]; } } printf("%lld\n",ans/2); //i->j j->i算了两遍 return 0;}
阅读全文
0 0
- Atcoder 083 Restoring Road Network(类弗洛伊德)
- hdu-1596find the safest road(迪杰斯特拉&&弗洛伊德)
- 弗洛伊德
- 弗洛伊德
- AtCoder Beginner Contest 083
- AtCoder
- AtCoder
- AtCoder
- AtCoder
- AtCoder
- Atcoder
- J2ME road——J2ME实现Network网络读取
- road
- Road
- Road
- Road
- Road
- road
- 分段与分页
- An Introduction to Flask 16~18
- 虚拟机的三种联网方式——理论篇
- TCP/IP、Http、Socket的区别
- Python机器学习Sklearn入门之神经网络
- Atcoder 083 Restoring Road Network(类弗洛伊德)
- 比特币基础概念入门 3
- 航天集团研发4000公里/小时高铁是一次战略考量
- PAT乙级 1048. 数字加密(20)
- Scrapy简明教程(三)——爬取CSDN博文并写入文件
- springmvc的web.xml详解
- numpy,scipy,matplotlib,pandas等简明教程
- python基础-Unit 1.认识python和基础知识
- spring boot pom文件模板