hihoCoder #1379 Emulator

hihoCoder Challenge 23, Prob. A
时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

有一个n个点的无向正权图G,这个图是连通的,小Y知道这些点两两之间的最短路的长度。

小J想要构造一个新的无向正权图G,使得新图中两两之间的最短路的长度与原图一样,并且边数最少。

输入

第一行一个整数n,表示点的个数。

接下来n行,每行n个整数。第i行第j个整数表示i点到j点的在G中的最短路长度,保证合法。

1n300,保证图G中最短路长度不超过109

输出

一个整数表示新图G的最小的边数。

样例输入

4
0 1 3 6
1 0 2 5
3 2 0 3
6 5 3 0

样例输出

3


Solution

这道题现场卡住了.
首先由题目描述可知原图G是连通图.
G=G(V,E), 现在不知道边集E, 只知道最短路矩阵D.

先考虑一个简化问题:

对于某条给定的边(u,v), 能否从最短路矩阵判断它是否必需 ("必需"即一定存在于原图中), 如果能, 如何判断?

能. 判断方法: 判断是否 xV {u,v}使得Du,v=Du,x+Dx,v.
证明:
(u,v)E, 用w(u,v)表示边(u,v)的长度. 显然w(u,v)Du,v. 又依题意, (u,v), w(u,v)>0.
Du,v=Du,x+Dx,v w(u,v)<Du,x, w(u,v)<Dx,v.

ux, xv 的最短路都一定不包含边 (u,v). (这好像很显然:))
这样就可以放心地将边(u,v)从图G中删除, 而最短路矩阵不变.

这样就可以得出一个迭代的算法. 而且可以推出:

对于给定的最短路矩阵D, 与之对应的边数最少的图是唯一的.

思维链条:

某条边(u,v)是否必需由最短路矩阵D唯一确定 删去非必需的边后最短路矩阵D不变 删掉的边是"独立"的, 互不影响.
删边的独立性直白地说即是:只有当图G中存在一条能替代(u,v)这条边的路径时才把(u,v)删除。

Implementation

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

const int N=305;

int d[N][N];

int main(){
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
		for(int j=0; j<n; j++)
			cin>>d[i][j];

	int res=n*(n-1)/2;

	for(int i=0; i<n; i++)
		for(int j=i+1; j<n; j++){
				for(int k=0; k<n; k++){
					if(k!=i && k!=j && d[i][j]==d[i][k]+d[k][j]){
						--res;
						break;
					}
				}			
		}

	cout<<res<<endl;
	return 0;
}
posted @   Pat  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示