hihocoder 1089 : 最短路径·二:Floyd算法

来源:互联网 发布:java时间格式化 校验 编辑:程序博客网 时间:2024/05/16 14:46

题目链接 : 点击打开链接

描述

万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋!

鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。

由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意两个地点之间的最短路径是多少呢?

提示:其实如果你开心的话,完全可以从每个节点开始使用Dijstra算法_(:з」∠)_。

输入

每个测试点(输入文件)有且仅有一组测试数据。

在一组测试数据中:

第1行为2个整数N、M,分别表示鬼屋中地点的个数和道路的条数。

接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。

对于100%的数据,满足N<=10^2,M<=10^3, 1 <= length_i <= 10^3。

对于100%的数据,满足迷宫中任意两个地点都可以互相到达。

输出

对于每组测试数据,输出一个N*N的矩阵A,其中第i行第j列表示,从第i个地点到达第j个地点的最短路径的长度,当i=j时这个距离应当为0。

样例输入
5 121 2 9672 3 9003 4 7714 5 1962 4 7883 1 6371 4 8832 4 825 2 6471 4 1982 4 1815 2 665
样例输出
0 280 637 198 394 280 0 853 82 278 637 853 0 771 967 198 82 771 0 196 394 278 967 196 0 
#include<stdio.h>#include<stdlib.h>#include<iostream>#include<math.h>#include<vector>#include<string>#include<sstream>#include<algorithm>#include<stack>#include<queue>#include<limits.h>#include<numeric>#include<cstring>#include<map>using namespace std;const int MAX_N = 1e2 + 10;const int MAX_M = 1e4 + 10;static int N, M, S, T;int graph[MAX_N][MAX_N] ={0};int prev_node[MAX_N];/*functino find the minst path in a undirected or directed graph*/int Dijkstra(int start, int terminal) {//dist保存从start到 j的最短距离bool mark[MAX_N];int dist[MAX_N];//initfor(int i =1; i<= N; ++i) {dist[i] = graph[start][i];mark[i] = false;if(dist[i] == INT_MAX) {prev_node[i] = -1;}else {prev_node[i] = start;}}dist[start] = 0;mark[start] = true;for(int i =2; i<=N; ++i) {int min_dist = INT_MAX;int k = start;for(int j =1; j<=N;++j) {if(!mark[j] && dist[j] < min_dist) {k = j;min_dist = dist[j];}}if(k == terminal) {return min_dist;}mark[k] = true;//对S集合外的节点,更新距离distfor(int j=1; j<=N; ++j){if((!mark[j]) && graph[k][j] < INT_MAX){if(dist[k] + graph[k][j] < dist[j]){dist[j] = dist[k] + graph[k][j];prev_node[j] = k;}}}}}/*floyd*/void floyd(){for(int k=1; k<=N;++k){for(int i=1; i<=N;++i){for(int j=1; j<=N; ++j){graph[i][j] = min(graph[i][j],(graph[i][k]+graph[k][j]));}}}}int main (){scanf("%d %d", &N, &M);int u, v, len;for(int i =1; i<=N; ++i) {for(int j=1; j<=N;++j) {if(i !=j )graph[i][j] = 1e4+5;}}while(M--) {scanf("%d %d %d",&u, &v, &len);graph[u][v] = graph[u][v]<len?graph[u][v]:len;graph[v][u] = graph[u][v];}floyd();for(int i =1; i<=N; ++i) {for(int j=1; j<=N; ++j){printf("%d ",graph[i][j]);}printf("\n");}//system("pause");return 0;}


0 0
原创粉丝点击