ZOJ2750_Idiomatic Phrases Game(最短路)

Idiomatic Phrases Game


Time Limit: 2 Seconds      Memory Limit: 65536 KB



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

Author: ZHOU, Ran

Source: Zhejiang Provincial Programming Contest 2006

解题报告

比较简单的最短路,处理建图就可以了。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 99999999
using namespace std;
struct node
{
    int t;
    char idiom[100];
} List[1010];
int n,mmap[1010][1010],dis[1010],vis[1010];
int Is_same(char *str1,char *str2)
{
    char s[10];
    int l1=strlen(str1),k=0;
    strncpy(s,str2,4);
    for(int i=l1-4; i<l1; i++)
    {
        if(str1[i]!=s[k++])
            return 0;
    }
    return 1;
}
void dij()
{
    int i,j,minn,u;
    for(i=0; i<n; i++)
    {
        dis[i]=mmap[0][i];
        vis[i]=0;
    }
    vis[0]=1;
    dis[0]=0;
    for(i=0; i<n-1; i++)
    {
        u=0;
        minn=inf;
        for(j=0; j<n; j++)
        {
            if(!vis[j]&&dis[j]<minn)
            {
                minn=dis[j];
                u=j;
            }
        }
        vis[u]=1;
        for(j=0; j<n; j++)
        {
            if(!vis[j]&&dis[j]>dis[u]+mmap[u][j])
            {
                dis[j]=dis[u]+mmap[u][j];
            }
        }
    }

    if(dis[n-1]!=inf)
    {
        printf("%d\n",dis[n-1]);
    }
    else printf("-1\n");
}
int main()
{
    int i,j;
    while(~scanf("%d",&n))
    {
        if(!n)break;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
                mmap[i][j]=inf;
            mmap[i][i]=0;
        }
        for(i=0; i<n; i++)
            scanf("%d%s",&List[i].t,List[i].idiom);
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                if(i!=j)
                if(Is_same(List[i].idiom,List[j].idiom))
                {
                    mmap[i][j]=List[i].t;
                }
            }
        }
        dij();
    }
    return 0;
}

ZOJ2750_Idiomatic Phrases Game(最短路)

时间: 2024-12-14 07:00:28

ZOJ2750_Idiomatic Phrases Game(最短路)的相关文章

hdu 1546 Idiomatic Phrases Game 最短路

Idiomatic Phrases Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2283    Accepted Submission(s): 742 Problem Description Tom is playing a game called Idiomatic Phrases Game. An idiom cons

ZOJ-2750 Idiomatic Phrases Game---Dijk最短路

题目链接: https://vjudge.net/problem/ZOJ-2750 题目大意: 给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的成语是4位16进制数字,每个成语前边跟的数字代表着找到这个成语之后再找到下个成语还需要t分钟 .(这里是找到该成语后还需要时间t,才能找到下一个成语) 思路: 每个成语有前面四个字符和后面四个字符,如果第i个成语后面字符等于第

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

图论精炼500题

忘了从哪转的了... =============================以下是最小生成树+并查集====================================== [HDU] 1213               How Many Tables                    基础并查集★ 1272               小希的迷宫                     基础并查集★ 1325&&poj1308    Is It A Tree?       

hdu图论题目分类

=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 基础并查集★ 1325&&poj1308 Is It A Tree? 基础并查集★ 1856 More is better 基础并查集★ 1102 Constructing Roads 基础最小生成树★ 1232 畅通工程 基础并查集★ 123

图论500题

=============================以下是最小生成树+并查集====================================== [HDU] 1213   How Many Tables   基础并查集★ 1272   小希的迷宫   基础并查集★ 1325&&poj1308  Is It A Tree?   基础并查集★ 1856   More is better   基础并查集★ 1102   Constructing Roads  基础最小生成树★ 12

图论题集收藏

 ===================下面是最小生成树+并查集====================================== [HDU] 1198   Farm Irrigation   并查集★(好题) 1598   find the most comfortable road 枚举+最小生成树★★ 1811   Rank of Tetris   并查集+拓扑排序★★ 3926   Hand in Hand   同构图★ 3938   Portal     离线+并查集★★