题目链接:............
题目大意:规则就是成语接龙中的规则, 在这以4个16进制为一位汉字,首尾的4个数相同则能连上(每个汉字前的时间表示找到下一个汉字花的时间),找能连上的最短时间
思路:生成图后用dijkstar.....水过
code:
#include <stdio.h>
#include <string.h>
#define inf 0x7fffffff;
int n = 0, map[1002][1002], cost[1002], dis[1002], used[1002];
char str[1002][1000];
void dijkstar()
{
int i = 0, j = 0, k = 0, min = 0;
for(i = 2; i<=n; i++)
{
used[i] = 0;
dis[i] = map[1][i];
}
used[1] = 1;
for(i = 1; i<n; i++)
{
min = inf;
for(j = 2; j<=n; j++)
if(!used[j] && min>dis[j] && dis[j] != -1)
{
min = dis[j];
k = j;
}
used[k] = 1;
for(j = 2; j<=n; j++)
{
if(!used[j] && map[k][j] != -1)
{
if(dis[j] == -1)
dis[j] = dis[k]+map[k][j];
else if(dis[j] > dis[k]+map[k][j])
dis[j] = dis[k]+map[k][j];
}
}
}
}
int main()
{
int i = 0, j = 0, k = 0, flag = 0, len = 0;
while(scanf("%d",&n), n)
{
memset(map, -1, sizeof(map));//图全部初始化为-1
for(i = 0; i<n; i++)
{
scanf("%d",&cost[i+1]);
getchar();
gets(str[i+1]);
}
for(i = 1; i<n; i++)
for(j = 1; j<=n; j++)
{
flag = 0;
len = strlen(str[i]);
for(k = 0; k<4; k++)
{
if(str[i][len-1-(3-k)] != str[j][k])
flag = 1;
}
if(flag)
continue;
map[i][j] = cost[i];//生成图
}
dijkstar();
printf("%d\n",dis[n]);
}
return 0;
}