Problem Description
胡小宝从来都是分不清东南西北的,这也难怪来济大快两年了还经常在八食和二食之间迷路,这真是件令人头疼的事。这不,新学期分新宿舍,小宝分到了南苑(这也太真实了),然鹅,济大教室聚集在北苑,哈哈,这对胡小宝来说简直是噩梦。同为济大人,热心的你能不能帮帮小宝呢?
请帮助他选出一条到达目的地的最短路线。
Input
输入数据有多组,每组的第一行是可能经过的地点间的路线条数N(0<N<=1000),第二行是两个字符串(s,e)表示起点和终点,接下来的N行是两个字符串(p1,p2)表示地名(0<p1,p2长度<35)和一个整数(d)表示这两个地点间的距离(0<d<1000)。
note:一组数据中地名数不会超过150个。如果N==-1,表示输入结束。
Output
对于每组测试数据,请在一行输出起点到终点的最短路线(两个地点间用-->隔开)以及距离。
Sample Input
9
学生公寓24号楼 信息楼
学生公寓24号楼 济大西南门 200
学生公寓24号楼 天桥 150
学生公寓24号楼 济大东南门 450
学生公寓24号楼 狗洞 200
天桥 信息楼 300
狗洞 济大东南门 350
狗洞 信息楼 300
济大东南门 信息楼 50
济大西南门 信息楼 500
1
济大超市 济大超市
洗浴中心 济大超市 50
-1
Sample Output
学生公寓24号楼-->天桥-->信息楼 450
济大超市 0
#include <stdio.h> #include <string.h> #define INF 2000000000 #define MAX 155 int search(char place[][35],char* p) //用于查找Place中是否已经存在p { int i; for (i=1; i<MAX; i++) //如果存在则返回其下标 if (strcmp(place[i],p)==0) return i; return -1; //不存在则返回-1 } int dijkstra(int map[][MAX], int pre[], int num, int sp, int ep) { int dist[MAX]; //起点到其他地点的最短距离 int s[MAX]; //集合s,存放已找出最短路径的地点 int min; int u; int i, j; //初始化数组 memset(dist,0,sizeof(dist)); memset(s,0,sizeof(s)); memset(pre,0,sizeof(pre)); for (i=1; i<=num; i++) { dist[i] = map[sp][i]; pre[i] = sp; } dist[sp] = 0; s[sp] = 1; for (j=1; j<=num-1; j++) { min = INF; u = sp; for (i=1; i<=num; i++) if (dist[i]<min&&!s[i]) { min = dist[i]; u = i; } s[u] = 1; if (s[ep]) //如果终点以找出 return dist[ep]; //返回起点到终点的最短距离 for (i=1; i<=num; i++) if (map[u][i]!=INF&&!s[i]&&dist[i]>map[u][i]+dist[u]) { dist[i] = map[u][i]+dist[u]; pre[i] = u; } } } int main() { char place[MAX][35]; //用于存储各个不同的地点 int map[MAX][MAX]; //将地点转换为数字,存储在map中 int n; char start[35]; char end[35]; char p[35]; int pre[MAX]; char temp[MAX][35]; int s,e; int a,b,c; int cnt; int t; int i,j; int dist; while (~scanf("%d",&n)) { if (n==-1) break; memset(place,0,sizeof(place)); cnt = 1; scanf("%s%s",start,end); for (i=0; i<MAX; i++) //初始化map for (j=0; j<MAX; j++) map[i][j] = INF; for (i=0; i<n; i++) { scanf("%s",p); a = search(place,p); //将p在place中的下标赋值給a if (a==-1) { strcpy(place[cnt],p); a = cnt; cnt++; } scanf("%s",p); b = search(place,p); //将p在place中的下标赋值給a if (b==-1) { strcpy(place[cnt],p); b = cnt; cnt++; } scanf("%d",&c); map[a][b] = map[b][a] = c; //无向图 } s = search(place,start); e = search(place,end); dist = dijkstra(map, pre, cnt, s, e); t = e; for (i=1; i<MAX; i++) { if (t==s) break; strcpy(temp[i],place[t]); t = pre[t]; } printf("%s",place[t]); for (i = i-1; i>=1; i--) printf("-->%s",temp[i]); printf(" %d ",dist); } return 0; }