求最短路径。
题目是双向图哦, 终点起点一样的话要输出0哦。
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
using namespace std;
#define MAX 200
#define INF 0xffffff
int g[MAX][MAX];
bool visited[MAX];
int lowcost[MAX];
char start[MAX], end[MAX];
map<string, int> stations;
int it;
bool dijkstra(int s) {
int i, j;
int min, v;
memset(visited, false, sizeof(visited));
for (i = 1; i < it; i++) {
lowcost[i] = g[s][i];
}
visited[s] = true;
for (i = 2; i < it; i++) {
min = INF;
for (j = 1; j < it; j++) {
if (!visited[j] && min > lowcost[j]) {
min = lowcost[j];
v = j;
}
}
if (min == INF) {
return false;
}
visited[v] = true;
for (j = 1; j < it; j++) {
if (!visited[j] && min + g[v][j] < lowcost[j]) {
lowcost[j] = min + g[v][j];
}
}
}
return true;
}
int main() {
int m;
int cost;
int i, j;
char a[MAX], b[MAX];
while (scanf("%d", &m) != EOF && m > 0) {
stations.clear();
for (i = 1; i < MAX; i++) {
for (j = 1; j < MAX; j++) {
if (j == i) {
g[i][j] = 0;
} else {
g[i][j] = INF;
}
}
}
it = 1;
scanf("%s%s", start, end);
stations[start] = it++;
stations[end] = it++;
for (i = 0; i < m; i++) {
scanf("%s%s%d", a, b, &cost);
if (!stations[a]) {
stations[a] = it++;
}
if (!stations[b]) {
stations[b] = it++;
}
if (g[stations[a]][stations[b]] > cost) {
g[stations[a]][stations[b]] = g[stations[b]][stations[a]] = cost;
}
}
if (strcmp(start, end) == 0) {
printf("0\n");
} else if (dijkstra(stations[start])){
printf("%d\n", lowcost[stations[end]]);
} else {
printf("-1\n");
}
}
return 0;
}