最短路径的算法及其应用:
算法有很多,包括上面没有讲到的和讲到的:
SSSP(单源最短路径):1.标号法 2.Dijkstra(可以用heap优化) 3.Bellman_ford(可以检测负环) 4.SPFA(可以检测负环,还可以继续优化,不过还没学)
所有点对的最短路径:1.可以求N次SSSP 2.Floyd算法
该章提到的应用问题:
1. 求图的中心点:
中心点定义:找出一个顶点,使得其到所有其他的顶点的最短路径的最大值最小。
求法:求出所有顶点对的最短路径,求出每个顶点到其他所有顶点的最短路径的最大值,从中选出最小的那个,用Floyd算法求解,时间复杂度为O(N^3).
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int inf = 0xffffff;
const int MAXN = 110;
#define MIN(a,b) (a)>(b)?(b):(a)
int g[MAXN][MAXN],d[MAXN][MAXN];
void init()
{
memset(g,0,sizeof(g));
}
void Floyd(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(g[i][j])d[i][j]=g[i][j];
else d[i][j]=inf;
if(i==j)d[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
d[i][k] = MIN(d[i][k],d[i][j]+d[j][k]);
}
}
}
}
int CenterPoint(int n)
{
int best=inf+1,best_i;
for(int i=0;i<n;i++)
{
int max = -1;
for(int j=0;j<n;j++)
{
if(d[i][j]>max)
{
max = d[i][j];
}
}
if(max<best)
{
best = max;
best_i = i;
}
}
return best_i;
}
int main()
{
int n;
init();
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>g[i][j];
}
}
Floyd(n);
int point = CenterPoint(n);
cout<<point<<endl;
system("pause");
return 0;
}
2.求图的P中心点:
P中心点的定义:记图的顶点集V的一个含有P个元素的子集为S,使得集合V-S中的顶点到S中顶点的最短路径的最大值最小的集合S,就是图的P中心点。
求法:求出所有顶点对的最短路径,枚举S的每一种情况,记录下集合V-S中的顶点到S中顶点的最短路径的最大值,然后从所有的情况中选出最小的种顶点的组
合方式,就是图的P中心点。
注意:需要枚举排列,复杂度很高,目前还没有有效算法。
代码略。
3.求图的中央点:
中央点的定义:记顶点V到其他各顶点的最短距离为d(x),每前进单位距离需要的代价为k,使得 所有的 k*d(x)的和最小的顶点就是图的中央点。
求法:求出所有顶点对的最短路径,求出每个顶点到其他所有顶点的(最短路径*代价)的和,选出使得该和最小的顶点,就是图的中央点。用Floyd算法,时
间复杂度为O(N^3).
代码(把前面代码的CenterPoint换成该函数即可,这里K取1)
int ZhongYangPoint(int n)
{
int best = inf,best_i;
for(int i=0;i<n;i++)
{
int sum = 0;
for(int j=0;j<n;j++)
{
sum+=d[i][j];
}
if(sum<best)
{
best = sum;
best_i = i;
}
}
return best_i;
}
分享到:
相关推荐
《图论的算法与程序设计》(作者)吴文虎 清华大学 1997年3月第1版
学习acm必备 吴文虎 王建德的图论必备书籍
本书是和吴文虎编著的枟程序设计基础(第 2 版)枠(清华大学出版社 2004 年出版)配合使用的参考 书 。 内容包括 2部分 :第 1部分包括了枟程序设计基础(第 2 版)枠书中全部习题和参考解答 ;第 2 部分 ...
清华大学吴文虎老师的c++教学课件 深入浅出 感觉非常实用 希望对学习软件的同学有帮助
程序设计基础(第二版) 吴文虎ppt第一讲
本书重点讲授在C/C++语言环境下,编写程序的思路和方法,涉及计算机语言、数据结构和常用算法等内容。全书内容丰富,强调动手实践,深入浅出地引导读者理性思维和理性实践,教学方法引入人胜,便于自学。...
吴文虎个人简介 讲解个人的思想 以及个人的算法
吴文虎的C++课件 通俗易懂 易理解 适合初学者用
这个是吴文虎的C语言课件PPT,现在只上传了一章。
计算机网络(第五版)吴文虎编著课后习题答案,内容很详细,很全面,对学习计算机网络的同学很有帮助。
清华大学 吴文虎清华大学 吴文虎 怎样上课
《程序设计基础》 吴文虎 清华大学出版社 此版本是讲义ppt
实用算法的分析与程序设计(吴文虎 王建德).rar
吴文虎《程序设计基础第2版》PPT编程准备C++源代码一般都由若干函数和类组成。为了便于管理,一般把不同功能的函数和类放在不同的文件中,对于类的声明和实现也分别放在对应的.h(或.hpp)和.cpp文件中。
这是清华大学教授吴文虎的关于C++程序设计的课件,是学习C++的好资料,对于程序员的编程风格以及已经注意的事项,讲的很详细。
相当全面 优秀的一套c++课件 吴文虎程序设计基础 课件
实用算法的分析与程序设计.part2 吴文虎著
吴文虎 组合数学的算法与程序设计 吴文虎 3本经典信息学竞赛黑皮书之一
本书重点讲授在C/C++语言环境下,编写程序的思路和方法,涉及计算机语言、数据结构和常用算法等内容。全书内容丰富,强调动手实践,深入浅出地引导读者理性思维和理性实践,教学方法引入人胜,便于自学。...
ACM黑书-实用算法的分析与程序设计_s10205419-吴文虎、王建德.part1,压缩成了两卷,完整版,含完整书签和辅助页(版权页、前言页、目录页、附录页、插页)...