Description
Input
Output
Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
Sample Output
2 -1
Floyd:
#include <stdio.h> const int INF = 0xfffffff; #define maxn 310 int grap[maxn][maxn]; //邻接矩阵存储图 int n , m; int dist[maxn][maxn]; //记录从所有点之间的最短距离 int min(int a,int b) { return a>b?b:a; } void init() // 对一些数据进行初始化 { int i , j; for(i = 0; i < n; i++) for(j = 0; j < n; j++) grap[i][j] = (i==j?0:INF); }
void floyd() { int i , j , k;//初始化, 一开始每个点与点之间的路径长度 就等于grap中的长度for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
dist[i][j] = grap[i][j];
for(k = 0; k < n; k++)
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
if(k ==i || k == j)
continue;
dist[i][j] = min(dist[i][k] + dist[k][j],dist[i][j]);
}
}
int main()
{
while(scanf("%d %d" , &n , &m)!=EOF)
{
init();int i , x , y , z;
for(i = 0; i < m; i++) //对有向图进行存储
{
scanf("%d %d %d" , &x , &y , &z);
//对每一组输入数据取与原来数据比较,两点多条路取最小路grap[x][y] = min(grap[x][y],z);
grap[y][x] = min(grap[y][x],z);
} floyd(); int s,t; scanf("%d %d",&s,&t); if(dist[s][t]==INF) printf("-1\n"); else printf("%d\n",dist[s][t]); } return 0; }
dijkstra: