ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)

 ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)

题意 :

给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的成语是4位16进制位,每个成语前边跟的数字代表着找到这个成语之后再找到下个成语还需要t分钟 。

思路 :

将所有的成语看成一个点,如果找到下一个成语,就建一条有向边,然后用dijkstra求最短路。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn = 1000+5;///N (0 < N < 1000)
 5 const int INF = 1000000000;//无穷大
 6 struct node{
 7     char front[5],back[5];///front[4]和back[4]用来存放结束符‘\0‘
 8     int T;///用来存放边的权重,从这个成语到其他成语所需的时间
 9 };
10 int Edge[maxn][maxn];//邻接矩阵
11 int dist[maxn];//用来存储原点到i结点的最短路径
12 int S[maxn];
13 int n;///字典中成语的数量
14 node dic[maxn];
15
16 void solve_case(int v0)
17 {
18     ///建图
19     for(int i=0;i<n;i++)
20     {
21         for(int j=0;j<n;j++)
22         {//判断从i->j是否有单向路径
23             Edge[i][j] = INF;
24             if(i==j) continue;
25             if(strcmp(dic[i].back,dic[j].front) == 0){
26                 Edge[i][j] = dic[i].T;
27             }
28         }
29      }
30
31      ///Dijkstra算法
32      for(int i=0;i<n;i++) //初始化
33      {
34          dist[i] = Edge[v0][i];S[i] = 0;
35       }
36       dist[v0] = 0;S[v0] = 1;///将源点加入S
37
38       for(int i=0;i<n-1;i++)///寻找n-1条最短路
39       {
40               int min = INF,u=0;
41           for(int j=0;j<n;j++)///寻找一个具有最短路的结点u
42           {
43               if(!S[j] && dist[j]<min)
44               {
45                   min = dist[j];u = j;
46               }
47           }
48           S[u] = 1;
49           ///更新与结点u能到达的点
50           for(int j=0;j<n;j++)
51           {
52               if(Edge[u][j]<INF && dist[u]+Edge[u][j]<dist[j]){
53                   dist[j] = dist[u] + Edge[u][j];
54               }
55            }
56        }
57        if(dist[n-1]==INF) cout<<-1<<endl;
58        else cout<<dist[n-1]<<endl;
59 }
60
61 int cin_case()
62 {
63     while(cin>>n && n)
64     {
65         char arr[100];
66         for(int i=0;i<n;i++)
67         {
68             cin>>dic[i].T>>arr;
69             int len = strlen(arr);
70             for(int j=0,k=len-1;j<4;j++,k--)
71             {///将读入的成语的第一个和第二个汉字存入字典
72                 dic[i].front[j] = arr[j];
73                 dic[i].back[3-j] = arr[k];
74             }
75             //////////一定要注意加字符结束符///////////
76             dic[i].front[4] = dic[i].back[4] = ‘\0‘;
77             ///////////////////////////////////////////
78         }
79         return 1;
80     }
81     return 0;
82 }
83
84 int main()
85 {
86     while(cin_case())
87     {
88         solve_case(0);
89      }
90
91     return 0;
92  } 

原文地址:https://www.cnblogs.com/yxh-amysear/p/8487961.html

时间: 2024-11-10 13:05:45

ZOJ 2750 -- Idiomatic Phrases Game(Dijkstra)的相关文章

zoj 1750 Idiomatic Phrases Game (dijkstra)

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 bui

ZOJ 2750 Idiomatic Phrases Game

Idiomatic Phrases Game 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 w

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

hdu 1874(Dijkstra )

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692    Accepted Submission(s): 10019 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路

poj1062昂贵的聘礼(Dijkstra**)

1 /* 2 题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi 3 g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, i>0) 4 g[u][0]表示不用替换该物品的实际价格 ! 5 d[0]表示的是第一个物品经过一系列的物品替换之后的最少优惠价格! 6 7 思路:每当我们通过Dijkstra算法得到离源点(1)最近的距离的节点 p的时候(也就是1...pre[p], p)这条 8 路径上的物品互相替换后得

ZOJ 2724 Windows 消息队列 (优先队列)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2724 Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something happens to this process, such as mouse click, text cha

ZOJ 1743 Concert Hall Scheduling(DP)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=743 题意:有两个音乐厅出租.给出n个租客,每个租客有个租的时间段[L,R],以及租费.任意时候音乐厅只能租给最多一个租客.问如何选择租给哪些租客使得赚的钱最多? 思路:f[i][j]表示第一个音乐厅到时刻i.第二个到时刻j,可以获得的最大值. struct node { int x,y,w; int operator<(const node &a) const

迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中.在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v

zoj 3696 Alien&#39;s Organ(泊松分布)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3696 Alien's Organ Time Limit: 2 Seconds      Memory Limit: 65536 KB There's an alien whose name is Marjar. It is an universal solder came from planet Highrich a long time ago. Marjar