标签: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