标签:src max 顶点 bsp play img splay 分享 位数组
一、Floyd-Warshall——加入点(多源最短路径,核心算法只有五行)
城市之间的最短路径
1 #include <stdio.h> 2 #define Max 99999 3 int main() 4 { 5 int map[10][10]; 6 int n, m, x, y, t; 7 int i, j, k; 8 scanf("%d%d",&n,&m); 9 for (i = 1;i <= n;i++) 10 { 11 for (j = 1;j <= n;j++) 12 { 13 if (i == j) 14 map[i][j] = 0; 15 else 16 map[i][j] = Max; 17 } 18 } 19 for (i = 1;i <= m;i++) 20 { 21 scanf("%d%d%d",&x,&y,&t); 22 map[x][y] = t; 23 } 24 for (k = 1;k <= n;k++) 25 { 26 for (i = 1;i <= n;i++) 27 { 28 for (j = 1;j <= n;j++) 29 { 30 if (map[i][k] < Max&&map[k][j]<Max&&map[i][j]>map[i][k] + map[k][j]) 31 { 32 map[i][j] = map[i][k] + map[k][j]; 33 } 34 } 35 } 36 } 37 for (i = 1;i <= n;i++) 38 { 39 for (j = 1;j <= n;j++) 40 printf("%d ",map[i][j]); 41 printf("\n"); 42 } 43 return 0; 44 }
二、Dijkstra——加入边(单源最短路径)
1 #include <stdio.h> 2 #define Max 99999 3 int main() 4 { 5 int map[10][10],dis[10],book[10]; 6 int n, m, x, y, t; 7 int i, j, k; 8 int min,mini; 9 scanf("%d%d",&n,&m); 10 for (i = 1;i <= n;i++) 11 { 12 for (j = 1;j <= n;j++) 13 { 14 if (i == j) 15 map[i][j] = 0; 16 else 17 map[i][j] = Max; 18 } 19 } 20 for (i = 1;i <= m;i++) 21 { 22 scanf("%d%d%d",&x,&y,&t); 23 map[x][y] = t; 24 } 25 for (i = 1;i <= n;i++) 26 dis[i] = map[1][i]; 27 for (i = 1;i <= n;i++) 28 book[i] = 0; 29 book[1] = 1; 30 for (i = 1;i <n;i++) 31 { 32 min = Max; 33 for (j = 1;j <= n;j++) 34 { 35 if (book[j] == 0 && min > dis[j]) 36 { 37 min = dis[j]; 38 mini = j; 39 } 40 } 41 book[mini] = 1; 42 for (j = 1;j <= n;j++) 43 { 44 if (map[mini][j] < Max) 45 { 46 if (dis[j] > dis[mini] + map[mini][j]) 47 { 48 dis[j] = dis[mini] + map[mini][j]; 49 } 50 } 51 } 52 } 53 for (i = 1;i <= n;i++) 54 { 55 printf("%d ",dis[i]); 56 } 57 printf("\n"); 58 return 0; 59 }
使用邻接表存储边
第六章 最短路径——有向图(Floyd-Warshall、Dijkstra、Bellman-Ford)
标签:src max 顶点 bsp play img splay 分享 位数组
原文地址:http://www.cnblogs.com/naglish/p/7074353.html