C++最短路径问题(用多种算法解决)

【问题描述】

平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点之间通路,通路的距离为两点间的直线距离。现在的任务是找出从一个点到另一个点之间的最短路径。

【输入格式】

第一行为整数n。

第二行到第n+1行,每行两个整数x和y,描述一个点的坐标。

第n+2行为一个整数m,表示图中连线的个数。

此后的m行,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

最后一行为两个整数s和t,分别表示源点和目标点。

【输出格式】

仅一行,一个实数(保留两位小数),表示s到t的最短路径长度。

【样例输入】

5

0 0

2 0

2 2

0 2

3 1

5

1 2

1 3

1 4

2 5

3 5

1 5

【样例输出】 

3.41

 【问题解答】

1.Floyed-Warshall(弗洛伊德)算法

#include
using namespace std;
int n,i,j,k,x,y,m,s,e,a[101][3];
double f[101][101];
int main(){
    cin>>n;
    for(i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];
    cin>>m;
    memset(f,0x7f,sizeof(f));
    for(i=1;i<=m;i++){
    	cin>>x>>y;
    	f[y][x]=f[x][y]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
	}
	cin>>s>>e;
	for(k=1;k<=n;k++){
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				if((i!=j)&&(i!=k)&&(j!=k)&&(f[i][k]+f[k][j]

2.Dijkstra(迪杰斯特拉)算法

#include
using namespace std;
int n,i,j,k,x,y,m,s,e,a[101][3];
double f[101][101],c[101],minn,maxn=1e30;
bool b[101][101];
int main(){
    cin>>n;
    for(i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];
    for(i=1;i<=n;i++){
    	for(j=1;j<=n;j++)f[i][j]=maxn;
	}
	cin>>m;
	for(i=1;i<=m;i++){
		cin>>x>>y;
		f[x][y]=f[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
	}
	cin>>s>>e;
	memset(b,false,sizeof(b));
	b[s]=true;
	c[s]=0;
	for(i=1;i<=n;i++)c[i]=f[s][i];
	for(i=1;i<=n;i++){
		minn=maxn;
		k=0;
		for(j=1;j<=n;j++){
			if((!b[j])&&(c[j]

3.Bellman-Ford(福特)算法

#include
using namespace std;
int main(){
	int n,k,x,y,m,f[1001][3],s,t;
    double a[101][3],dis[1001],w[1001],minn;
    bool b[101];
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i][1],&a[i][2]);
	cin>>m;
	for(int i=1;i<=n;i++){
		dis[i]=0x7fffffff/3;
		f[i][1]=f[i][2]=0x7fffffff/3;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		f[i][1]=x;
		f[i][2]=y;
		w[i]=sqrt(pow(a[x][1]-a[y][1],2)+pow(a[x][2]-a[y][2],2));
	}
	cin>>s>>t;
	dis[s]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(dis[f[j][1]]+w[j]

本文内容为小编自己汇总,内容可能会有错误或疏漏,感谢大家的提议!

记得点赞和关注哦~

你可能感兴趣的:(OJ题解,c++)