传送门

最短路。
这道题题意比较烦,其实就是成语接龙。给你一个成语的列表(字典)(每个成语用十六进制字符串表示),规定字典的第一个成语和最后一个成语是你完成成语接龙的起点和终点,然后你在字典里面选成语接龙中间的成语,A->B当且仅当A的后四个字符等于B的前四个字符。然后每个成语给你的时候还额外给一个数,表示这个成语到其所有的后驱成语(若有)的边的权值(可以看出最后那个成语的这个数没用)。问你起点到终点最小值。

其实就是把成语看成点,这个字典一行一行给你点的信息,但是点之间的边的关系是隐藏的,那我就建两个数组存储前缀和后缀,输入当前点时,拿这个点的前缀后缀和前面那些点的后缀数组前缀数组比较然后建边就ok了(想一想为什么可以边输入边查找?为什么不用考虑后面输入的点和这个点的关系?2333),这样就完成了建图。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <map>
using namespace std;const int INF = 1e9;
const int MAXN = 1002;
int N;
int d[MAXN];
struct Edge
{int to, w;
};
vector<Edge> v[MAXN];
vector<string> first;
vector<string> last;int dis[MAXN];
bool vis[MAXN];void init()
{first.clear();last.clear();for (int i = 0; i < N; i++) v[i].clear();
}void dijkstra(int s)
{fill(dis, dis + N, INF);memset(vis, 0, sizeof vis);dis[s] = 0;for (int i = 0; i < N; i++){int mind = INF, u = -1;for (int j = 0; j < N; j++){if (!vis[j] && dis[j] < mind){mind = dis[j];u = j;}}if (u == -1) break;vis[u] = 1;for (int j = 0; j < v[u].size(); j++){int t = v[u][j].to;int w = v[u][j].w;if (!vis[t] && dis[u] + w < dis[t]){dis[t] = dis[u] + w;}}}
}int main()
{string str, f, l;for (; ~scanf("%d", &N);){if (!N) break;init();for (int i = 0; i < N; i++){cin >> d[i] >> str;f = str.substr(0, 4);l = str.substr(str.size() - 4, 4);   for (int j = 0; j < last.size(); j++){if (last[j] == f)v[j].push_back(Edge{ i,d[j] });}for (int j = 0; j < first.size(); j++){if (first[j] == l)v[i].push_back(Edge{ j,d[i] });}last.push_back(l);                          // 这两行放到查找后面是因为怕出现自连接边(这个成语本身首尾相等),但其实出现了也无影响first.push_back(f);}dijkstra(0);if (dis[N - 1] == INF)printf("-1\n");else printf("%d\n", dis[N - 1]);}return 0;
}

转载于:https://www.cnblogs.com/CrossingOver/p/10704862.html

HDU 1546 Idiomatic Phrases Game相关推荐

  1. 【HDU - 1546】 Idiomatic Phrases Game(Dijkstra,可选map处理字符串)

    题干: Tom is playing a game called Idiomatic Phrases Game. An idiom consists of several Chinese charac ...

  2. HDU 1546 (最短路 Dijkstra算法)

    题目: Tom is playing a game called Idiomatic Phrases Game. An idiom consists of several Chinese charac ...

  3. hdu 1546(最短路)

    题意:成语接龙的游戏,一个中文字是四个字符组成,所以只要一个字符串后四个字符与另一个字符串的头四个字符能匹配,那么就能接上,求出从第一个到最后一个的最短时间. 不知道是建图的问题还是什么,一直WA.. ...

  4. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  7. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  8. kk_想要学习的知识

    2018/4/27 计算几何 一.简介 计算几何属于ACM算法中比较冷门的分类,在省赛中只在前几年考察过,这两年还没有考过,而且和高精度计算一样,遇到题目主要靠套模板,因此对题意的理解至关重要,而且往 ...

  9. 图论练习题(存起来练)

    =============================以下是最小生成树+并查集======================================  [HDU]  1213 How Man ...

最新文章

  1. 什么是RNA-Seq (RNA Sequencing)
  2. JSON 基础解释.
  3. C++ 类的保护继承与构造函数
  4. ise 时钟约束_「新手入门」ISE工程升级到Vivado及板级信号调试技术
  5. 最优化学习笔记(七)——Levenberg-Marquardt修正(牛顿法修正)
  6. 使用RDLC报表(三)--向RDLC报表传入参数
  7. Python框架篇之Django(Template模版:标签tag、自定义filter、extend模板继承)
  8. 第五章:【UCHome二次开发】模板解析
  9. JNI:需要显式指定使用jar的全路径
  10. 【语音去噪】基于matlab GUI谱减法+维纳滤波语音去噪(带面板+信噪比)【含Matlab源码 1661期】
  11. 反转链表详解(Python)
  12. VS 201x C++ 编译错误解决方法集
  13. 通过银行卡号查询银行卡类型接口
  14. webstorm连接github上传代码
  15. c语言两个矩形相交部分坐标,C++判断矩形相交的方法
  16. U盘格式选择 FAT32、exFAT、NTFS
  17. Neo4j-Cypher
  18. 如何通过浏览器访问本地电脑文件
  19. 细说MySQL的时间戳(Timestamp)类型
  20. 怎样实现MindMapper中主题的自由移动

热门文章

  1. JS获取对象的第一个值
  2. python中唯一的映射类型是什么_Python基础类型之字典(dict)
  3. 郑大远程计算机应用基础第09,郑大远程教育《计算机应用基础》第09章在线测试...
  4. Maven引用本地jar并在打war包时引用jar
  5. 升级到jdk1.8后 sun/io/CharToByteConverter错误及处理
  6. CF Round #722 (Div. 2) C. Parsa‘s Humongous Tree(树形dp)
  7. 【POJ2559】Largest Rectangle in a Histogram(单调栈)
  8. 2018百度之星程序设计大赛 - 资格赛 P1006三原色图(MST,并查集)
  9. 【NOIP2015】【Luogu2670】扫雷游戏(搜索,字符串输入输出)
  10. 【NOIP2017】【Luogu3954】成绩(模拟)