题目:http://ac.jobdu.com/problem.php?pid=1447
Dijkstra实现:【邻接矩阵版】
#include<cstdio>
#define maxSize 100000000
using namespace std;
int edges[110][110]; //边长
int visit[220]; //表示是否已访问
int dist[220]; //表示当前已经找到的从V0到Vi的最短路径长度
int main() {
int n, m, a, b, c;
while (scanf("%d%d", &n, &m) != EOF) {
if (0 == n && 0 == m) break;//退出
for (int i = 1; i <= n; i++) {//初始化边长
for (int j = i + 1; j <= n; j++) {
edges[i][j] = edges[j][i] = maxSize;
}
edges[i][i] = 0;
}
for (int i = 0; i < m; i++) {//输入
scanf("%d%d%d", &a, &b, &c);
edges[a][b] = edges[b][a] = c;
}
for (int i = 1; i <= n; i++) {//初始化
dist[i] = edges[1][i];
visit[i] = 0;
}
visit[1] = 1;
for (int k = 2; k <= n; k++) {
int min = maxSize, key = 0;
for (int i = 2; i <= n; i++) {//选最小边
if (visit[i] == 0 && min > dist[i]) {
min = dist[i];
key = i;
}
}
visit[key] = 1;//加入出发点
for (int j = 2; j <= n; j++) {//更新
if (visit[j] == 0 && dist[key] + edges[key][j] < dist[j])
dist[j] = dist[key] + edges[key][j];
}
}
printf("%d\n", dist[n]);
}//while
return 0;
}
Floyd实现:”
#include<cstdio>
using namespace std;
int ans[110][110];
int main() {
int n, m, a, b, c;
while (scanf("%d%d", &n, &m) != EOF) {
if (0 == n && 0 == m) break;//退出
for (int i = 1; i <= n; i++) {//初始化
for (int j = 1; j <= n; j++)
ans[i][j] = -1;
ans[i][i] = 0;
}
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &a, &b, &c);
ans[a][b] = ans[b][a] = c;
}
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
if (-1 == ans[i][k] || -1 == ans[k][j])
//与k不连通
continue;
if (-1 == ans[i][j]
|| ans[i][j] > ans[i][k] + ans[k][j]) {
//更新最短路径值
ans[i][j] = ans[i][k] + ans[k][j];
}
}//for-j
printf("%d\n", ans[1][n]);//输出结点1到n的最短路径
}//while
return 0;
}