题意

有一张无向带权连通图(点数<=300),给出任意两点i,j之间的最短路长度dis[i][j].问是否存在一张这样的无向图.如果不存在输出-1.如果存在输出所有这样的无向图中边权和最小的一张的边权和.

分析

如果存在i,j,k(i,j,k互不相同)使得dis[i][k]+dis[k][j]<dis[i][j]那么一定不存在.否则一定存在.

对于i,j(i!=j),如果存在第三个点k使得dis[i][k]+dis[k][j]=dis[i][j],那么为了总的边权和最小,i和j必然没有连边,i和j之间的最短路径是从i到k的最短路径和k到j的最短路径连接起来得到的.

如果不存在这样的k,i和j之间必然存在一条边权为dis[i][j]的边.

O(n^3)完事了.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=305;
int dis[maxn][maxn];
bool notneed[maxn][maxn];
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%d",&dis[i][j]);
}
}
bool flag=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&&j!=k&&k!=i){
if(dis[i][j]+dis[j][k]<dis[i][k])flag=false;
if(dis[i][j]+dis[j][k]==dis[i][k])notneed[i][k]=true;
}
}
}
}
if(!flag){
printf("-1\n");
}else{
long long ans=0;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
if(!notneed[i][j])ans+=dis[i][j];
}
}
printf("%lld\n",ans);
}
return 0;
}

最新文章

  1. HTML超标记语言
  2. 重绘控件中OnPaint、OnDraw、OnDrawItem和DrawItem的区别
  3. 循环报数 Java实现
  4. ptypes中string类的空间分配
  5. 基于CSS3制作的鼠标悬停动画菜单
  6. app应用程序本地化--备用
  7. poj2886
  8. [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX
  9. idea中建立maven web项卡在Generating Project in Batch mode
  10. 51nod_1122:机器人走方格 V4 (矩阵快速幂)
  11. CRM实施失败?请注意这6大问题及对策!
  12. COMP 321
  13. MD5 Hashing in Java
  14. HTTP协议、HTTP请求方法、常见状态码、HTTP消息
  15. en-zh(社会问题)social problems-2
  16. zabbix-Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused
  17. [03-01] JSP自定义标签
  18. latex与word之间的各种转化方法
  19. 中国网建提供的SMS短信发送
  20. Java 一维多项式计算

热门文章

  1. 20155320信息安全系统设计第二周课堂考试总结及myod的实现
  2. 20155320 2016-2017-2 《Java程序设计》第二周学习总结
  3. 20155338 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
  4. 每天一个linux命令(1):ln 命令
  5. 优步uber司机常见问题与答案(成都地区官方)
  6. 2288: 【POJ Challenge】生日礼物
  7. eclipse中编译出现错误undefined reference to `_sbrk&#39;
  8. git拉代码,IntelliJ idea报错,cannot load module xxxxx
  9. Nginx内容缓存
  10. python中取整的几种方法