
正文
zoj 2750 Idiomatic Phrases Game
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
迪杰斯特拉单源最短路算法。对成语进行预处理。做出邻接矩阵即可。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = ;
int c[maxn], len[maxn], cost[maxn][maxn], flag[maxn], e[maxn];
char s[maxn][];
int main()
{
int n, i, j, ii;
while (~scanf("%d", &n))
{
if (n == ) break;
for (i = ; i < n; i++) scanf("%d%s", &c[i], s[i]);
for (i = ; i < n; i++) len[i] = strlen(s[i]);
memset(flag, , sizeof(flag));
for (i = ; i <= n; i++) for (j = ; j <= n; j++) cost[i][j] = ;
for (i = ; i < n; i++)
{
for (j = ; j < n; j++)
{
if (i != j&&s[j][] == s[i][len[i] - ] && s[j][] == s[i][len[i] - ] && s[j][] == s[i][len[i] - ] && s[j][] == s[i][len[i] - ])
cost[i][j] = c[i];
}
}
for (i = ; i < n; i++) e[i] = cost[][i];
e[] = ; flag[] = ; int x, uu;
for (ii = ; ii < n - ; ii++)
{
int minn = ; uu = ;
for (i = ; i < n; i++)
{
if (!flag[i] && e[i] < minn)
{
x = i;
minn = e[i];
uu = ;
}
}
if (!uu) continue;
flag[x] = ;
for (i = ; i < n; i++)
if (!flag[i] && cost[x][i] != && e[x] + cost[x][i] < e[i])
e[i] = e[x] + cost[x][i];
}
if (e[n - ] != ) printf("%d\n", e[n - ]);
else printf("-1\n");
}
return ;
}






