hdu 1546(dijkstra)

Idiomatic Phrases Game

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3154    Accepted Submission(s): 1026

Problem Description

Tom
is playing a game called Idiomatic Phrases Game. An idiom consists of
several Chinese characters and has a certain meaning. This game will
give Tom two idioms. He should build a list of idioms and the list
starts and ends with the two given idioms. For every two adjacent
idioms, the last Chinese character of the former idiom should be the
same as the first character of the latter one. For each time, Tom has a
dictionary that he must pick idioms from and each idiom in the
dictionary has a value indicates how long Tom will take to find the next
proper idiom in the final list. Now you are asked to write a program to
compute the shortest time Tom will take by giving you the idiom
dictionary.

Input

The
input consists of several test cases. Each test case contains an idiom
dictionary. The dictionary is started by an integer N (0 < N <
1000) in one line. The following is N lines. Each line contains an
integer T (the time Tom will take to work out) and an idiom. One idiom
consists of several Chinese characters (at least 3) and one Chinese
character consists of four hex digit (i.e., 0 to 9 and A to F). Note
that the first and last idioms in the dictionary are the source and
target idioms in the game. The input ends up with a case that N = 0. Do
not process this case.

Output

One
line for each case. Output an integer indicating the shortest time Tome
will take. If the list can not be built, please output -1.

Sample Input

5
5 12345978ABCD2341
5 23415608ACBD3412
7 34125678AEFD4123
15 23415673ACC34123
4 41235673FBCD2156
2
20 12345678ABCD
30 DCBF5432167D
0

Sample Output

17
-1

题意:给出n组"成语",每个成语都有其权值,对于任意两个成语,如果第一个成语的后4个字符能够与另外一个成语的前4个字符匹配,则这两个成语是可以接上去的,问从第一个成语开始,能否找到一条接的顺序,让第一个成语能够接到最后一个.如果能,输出接到最后一个所花费的最小代价,不能够则输出-1.

题解:将每个成语看成一个点,能够接上去则连上一条边。然后dijkstra算法进行求解.

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
const int N = 1005;
const int INF = 99999999;
struct Node{
    char s[5],e[5];
    int w;
}node[N];
int graph[N][N];
int n;
void deal(char s[],int id){
    for(int i=0;i<4;i++) node[id].s[i] = s[i];
    int len = strlen(s);
    int k =0;
    for(int i=len-4;i<len;i++) {
        node[id].e[k++] = s[i];
    }
}
int low[N];
bool vis[N];
void dijkstra(int s){
    memset(vis,false,sizeof(vis));
    for(int i=0;i<n;i++){
        low[i] = (i==s)?0:graph[s][i];
    }
    vis[s] = true;
    for(int i=1;i<n;i++){
        int Min = INF;
        for(int j=0;j<n;j++){
            if(Min>low[j]&&!vis[j]){
                s=j;
                Min = low[j];
            }
        }
        vis[s] = true;
        for(int j=0;j<n;j++){
            if(low[j]>low[s]+graph[s][j]&&!vis[j]){
                low[j]=low[s]+graph[s][j];
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF&&n){
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(i==j) graph[i][j] = 0;
                else graph[i][j]=INF;
            }
        }
        for(int i=0;i<n;i++){
            char str[N];
            scanf("%d%s",&node[i].w,str);
            deal(str,i);
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(strcmp(node[i].e,node[j].s)==0) graph[i][j] = node[i].w;
            }
        }
        dijkstra(0);
        if(low[n-1]>=INF) printf("-1\n");
        else printf("%d\n",low[n-1]);
    }
    return 0;
}
时间: 2024-10-10 16:18:18

hdu 1546(dijkstra)的相关文章

HDU 1546 Idiomatic Phrases Game

成语接龙. 上一个的尾必须和下一个的首相同.注意:花费的时间是上一个. 一开始我就建图建错了. 比如第 i 个成语 与第 j 个成语, 第  i 个成语前面的时间为 t : 建图为 i -> j = t: 基友说这<图论算法理论.实现及应用>上有一样的题,我借来看了一下,发现它建图似乎有错误. 0->3 这条边的权值似乎错了. 反正我的建图是这样的 0->1=5;0->3=5; 1->2=5; 2->4=7; 3->4=15; 求 0 -> 4

hdu 1548 (dijkstra解法)(一次AC就是爽)

恭喜福州大学杨楠获得[BestCoder Round #4]冠军(iPad Mini一部) <BestCoder用户手册>下载 A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11670    Accepted Submission(s): 4430 Problem Description There is

hdu 2680 (Dijkstra)

快放暑假了,训练又要开始了.先从熟悉的图论开始做吧. 题意:一张有向图中有若干起点一个终点,让你算最短路,方法很简单只需人为加一个起点指向所有起点让后距离为0即可. 代码如下: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <set> 5 #include <iostream> 6 #include <queue> 7 #inc

HDU 2112 HDU Today (Dijkstra算法)

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13952    Accepted Submission(s): 3264 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

HDU 1546 Idiomatic Phrases Game(dijkstra+优先队列)

Idiomatic Phrases Game Problem Description Tom is playing a game called Idiomatic Phrases Game. An idiom consists of several Chinese characters and has a certain meaning. This game will give Tom two idioms. He should build a list of idioms and the li

HDU 2122 HDU Today(dijkstra+map)

HDU Today Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了.这样住了一段时间,徐总对当地的交通还是不太了解.有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格).徐总经常会问蹩脚

hdu 2544 hdu 1874 Dijkstra 模板题

hdu 2544  求点1到点n的最短路 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long

hdu 2112 dijkstra+优先队列

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15727    Accepted Submission(s): 3693 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HD

hdu 1874, dijkstra

import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner; public class Main { private int n, m, s, t, cnt; private int[] head, d; private static final int MAXIMUM = 20000000; private boolean[] don