成语接龙,告诉的是边的信息,但是这个其实就是告诉的一个起点,和一条边,终点可能是不可达的,所以最终告诉你的还是点的信息。
先处理字符串,存入图中,然后就可以用Dijkstra了。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define NLEN 1010
#define INF 0x3fffffff
int cost[NLEN];
char sstr[NLEN];
int map[NLEN][NLEN];
typedef struct Node {
char s1[5];
char s2[5];
int u, v;
}Node;
Node node[NLEN];
typedef struct Point {
char str[5];
}Point;
Point point[NLEN];
void dijkstra(int num) {
int dis[NLEN];
int vis[NLEN];
memset(vis, 0, sizeof(vis));
for(int i = 0; i < num; i++) {
dis[i] = map[0][i];
}
dis[0] = 0;
vis[0] = 1;
for(int i = 1; i < num; i++) {
int min = INF;
int imin = 0;
for(int j = 0; j < num; j++) {
if(!vis[j] && dis[j] < min) {
min = dis[j];
imin = j;
}
}
vis[imin] = 1;
for(int j = 0; j < num; j++) {
if(!vis[j] && map[imin][j] < INF && map[imin][j] + dis[imin] < dis[j]) {
dis[j] = map[imin][j] + dis[imin];
}
}
}
if(dis[num-1] == INF) printf("-1\n");
else printf("%d\n", dis[num-1]);
}
int main() {
int t;
while(scanf("%d", &t), t != 0) {
int num = 0;
memset(node, 0, sizeof(node));
for(int i = 0 ; i < t; i++) {
memset(sstr, 0, sizeof(sstr));
scanf("%d%s", &cost[i], sstr);
int len = strlen(sstr);
int k;
for(int j = 0; j < 4; j++) {
node[i].s1[j] = sstr[j];
node[i].s2[j] = sstr[len-4+j];
}
}
for(int i = 0; i < t; i++) {
for(int j = 0; j < t; j++) {
map[i][j] = INF;
if(i == j) continue;
else if(!strcmp(node[i].s2, node[j].s1)) {
map[i][j] = cost[i];
}
}
}
dijkstra(t);
}
return 0;
}