第三部分 数据结构 -- 第四章 图论算法-1378:最短路径(shopth)

1378:最短路径(shopth)

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3595 通过数: 1367
【题目描述】
给出一个有向图G=(V, E),和一个源点v0∈V,请写一个程序输出v0和图G中其它顶点的最短路径。只要所有的有向环权值和都是正的,我们就允许图的边有负值。顶点的标号从1到n(n为图G的顶点数)。

【输入】
第1行:一个正数n(2≤n≤80),表示图G的顶点总数。

第2行:一个整数,表示源点v0(v0∈V,v0可以是图G中任意一个顶点)。

第3至第n+2行,用一个邻接矩阵W给出了这个图。

【输出】
共包含n-1行,按照顶点编号从小到大的顺序,每行输出源点v0到一个顶点的最短距离。每行的具体格式参照样例。

【输入样例】

5
1
0 2 - - 10
- 0 3 - 7
- - 0 4 -
- - - 0 5
- - 6 - 0

【输出样例】
(1 -> 2) = 2
(1 -> 3) = 5
(1 -> 4) = 9
(1 -> 5) = 9
【提示】
样例所对应的图如下:
在这里插入图片描述

思路:根据题目给出的邻接矩阵,利用Floyd算法求出各个点间的最短路径,然后挨个输出所求点到每个点的最短路径。

#include<cstdio>
#include<iostream>
#define INF 0X3F3F3F3F
#define N 100
using namespace std;
int map[N][N];//map数组存放邻接矩阵 
int n;
void floyd(){
for(int k = 1; k <= n; k++){

  for(int i = 1; i <= n; i++){
  
     for(int j = 1; j <=n; j++)
      {
     	map[i][j] =min(map[i][j],map[i][k]+map[k][j]); //更新最短路 
       }
    } 
  }
}

int main(){
	scanf("%d",&n);
	int s;
	scanf("%d",&s);
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			int a;
			if(scanf("%d", &a) == 1)
			map[i][j] = a;//如果输入合法,则赋值给map[i][j],0也包含 
			else map[i][j] = INF; //如果不合法,说明不连通,赋值INF
		}
	}
	floyd();
	for(int i = 1; i <= n; i++)
	{
		if(s != i){
			printf("(%d -> %d) = %d\n",s, i, map[s][i]); //输出到其他点的最短路 
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章