使用 Dijkstra算法,首先建立有向图,将每个单词作为一个结点,和能直接接在其后的单词连线,然后计算起点到终点的最短距离即可。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
struct Word //单词
{
int time; //查找后续单词所需时间
char first[5], last[5]; //前4个字符,后4个字符
}word[MAXN];
int N; //单词数
char str[MAXN]; //每次输入的单词
int mp[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
//建图
void buildMap()
{
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
if (strcmp(word[i].last, word[j].first) == 0)
mp[i][j] = word[i].time;
else
mp[i][j] = INF;
}
}
}
//Dijkstra算法,计算结点s到其他点的最短路径
void Dijkstra(int s)
{
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= N; i++)
{
dis[i] = mp[s][i];
}
int k = s, minDis;
vis[k] = true;
for (int i = 1; i < N; i++)
{
minDis = INF;
for (int j = 1; j <= N; j++)
{
if (vis[j] == true)
continue;
if (minDis > dis[j])
{
minDis = dis[j];
k = j;
}
}
vis[k] = true;
for (int j = 1; j <= N; j++)
{
if (vis[j] == false && dis[j] > dis[k] + mp[k][j])
dis[j] = dis[k] + mp[k][j];
}
}
}
int main()
{
while (cin >> N)
{
if (N == 0)
break;
for (int i = 1; i <= N; i++)
{
cin >> word[i].time >> str;
int len = strlen(str);
for (int j = 0; j < 4; j++)
{
word[i].first[j] = str[j];
word[i].last[j] = str[len - 4 + j];
}
}
buildMap();
Dijkstra(1);
if (dis[N] != INF)
cout << dis[N] << endl;
else
cout << -1 << endl;
}
return 0;
}
继续加油。