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 最短路
原文:http://blog.csdn.net/lionel_d/article/details/44758341