标签:hdu1546 idiomatic phrases ga 最短路 dijkstra
5 5 12345978ABCD2341 5 23415608ACBD3412 7 34125678AEFD4123 15 23415673ACC34123 4 41235673FBCD2156 2 20 12345678ABCD 30 DCBF5432167D 0
17 -1
给出n个“成语”, 这写成语至少由3个“汉字”组成,所谓的“汉字”,是指4个连续的16进制数字(1~9, A~F)。
以第一个成语作为起点,最后一个作为终点, 需要找出一个序列,这个序列的前一个成语的最后一个“汉字”与后一个成语的第一个“汉字”是相同的,求最少花费时间。
代码:
#include <stdio.h>
#include <string.h>
#define INF 1000000000
struct Node{
char s[5],e[5] ;
int t ;
}list[1100];
int graph[1100][1100] , dis[1100];
void dijkstra(int n)
{
bool visited[1100] ;
for(int i = 0 ; i < n ; ++i)
{
dis[i] = graph[0][i] ;
visited[i] = false ;
}
dis[0] = 0 ;
visited[0] = true ;
for(int i = 1 ; i < n ; ++i)
{
int min = INF , index = -1 ;
for(int j = 0 ; j < n ; ++j)
{
if(!visited[j] && min>dis[j])
{
index = j ;
min = dis[j] ;
}
}
if(index == -1)
{
return ;
}
visited[index] = true ;
for(int j = 0 ; j < n ; ++j)
{
if(!visited[j] && dis[j]>min+graph[index][j])
{
dis[j] = min+graph[index][j] ;
}
}
}
}
int main()
{
int n ;
while(scanf("%d",&n) && n)
{
for(int i = 0 ; i < n ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{
graph[i][j] = INF ;
}
}
char str[110] ;
for(int i = 0 ; i < n ; ++i)
{
scanf("%d%s",&list[i].t,str) ;
for(int j = 0 ; j < 4 ; ++j)
{
list[i].s[j] = str[j] ;
}
list[i].s[4] = '\0' ;
int k = 0 ;
for(int j = strlen(str)-4 ; j < strlen(str) ; ++j)
{
list[i].e[k++] = str[j] ;
}
list[i].e[4] = '\0' ;
}
for(int i = 0 ; i < n-1 ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{
if(strcmp(list[i].e,list[j].s)==0)
{
graph[i][j] = list[i].t ;
}
}
}
dijkstra(n) ;
if(dis[n-1] == INF)
puts("-1") ;
else
printf("%d\n",dis[n-1]) ;
}
return 0 ;
}hdu 1546 Idiomatic Phrases Game 最短路
标签:hdu1546 idiomatic phrases ga 最短路 dijkstra
原文地址:http://blog.csdn.net/lionel_d/article/details/44758341