传送门

成语接龙,找每个单词都需要一点时间,问最少的时间

把字符串用map处理成数字编号,之后用floyd

 #include<bits/stdc++.h>
using namespace std;
map<string,int>g;
int road[][];
int num=;
const int inf=0x3f3f3f3f;
void floyd()
{
for(int k=;k<num;k++)
{
for(int i=;i<num;i++)
{
for(int j=;j<num;j++)
{
road[i][j]=road[i][j]>road[i][k]+road[k][j]?road[i][k]+road[k][j]:road[i][j];
// cout<<i<<" "<<j<<" "<<road[i][j]<<endl;
}
}
}
}
void init()
{
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
road[i][j]=inf;
}
road[i][i]=;
}
}
int main()
{
int n;
while(~scanf("%d",&n),n)
{ num=;g.clear();init();
int start=,endd=;
for(int i=;i<n;i++)
{
int t;char s[];
scanf("%d %s",&t,s);
char pre[]={'\0'},end[]={'\0'};
for(int j=;j<;j++)
{
pre[j]=s[j]; }
//printf("%s ",pre);
int temp=;
for(int j=strlen(s)-;j<strlen(s);j++)
{
end[temp++]=s[j];
}
// printf("%s\n",end);
if(!g[pre])g[pre]=num++;
if(!g[end])g[end]=num++;
// printf("%d %d\n",g[pre],g[end]);
if(i==)start=g[pre];
if(i==n-)endd=g[pre];
if(t<road[g[pre]][g[end]])road[g[pre]][g[end]]=t;
}
floyd();
// printf("%d %d\n",start,endd); if(road[start][endd]==inf)
{
printf("-1\n");
}
else printf("%d\n",road[start][endd]);
}
return ;
}

最新文章

  1. 使用jOrgChart插件实现组织架构图的展示
  2. POJ 2352 Stars 线段树
  3. 16-01-25---Servlet复习笔记(01)
  4. 【bzoj2318】Spoj4060 game with probability Problem
  5. [iOS]浅谈NSRunloop工作原理和相关应用
  6. 如何用js刷新aspxgridviw
  7. WCDMA是什么意思?CDMA是什么意思?GSM是什么意思
  8. Java Observable 模式
  9. bzoj3039
  10. thinkphp分页时修改last显示标题
  11. Storyboard 经常用法总结-精华版
  12. Git使用详细教程(9):git log
  13. 我的mybatis从oracle迁移转换mysql的差异【原】
  14. 题解 P3246 【[HNOI2016]序列】
  15. gradle3.0新命令
  16. Oracle 故障整理
  17. C# 多线程八之并行Linq(ParallelEnumerable)
  18. 微信公众号DOM的一个坑
  19. Codeforces Round #530 (Div. 2) F - Cookies
  20. 深入jetty的使用详解

热门文章

  1. sqlserver 一个字段分成两个字段 截取,保存
  2. Memcahce和Redis比较
  3. 【JavaScript】赛码网前端笔试本地环境搭建
  4. linux下ab网站压力测试命令
  5. Jython的应用
  6. 初识Qt鼠标、键盘事件及定时器和随机数
  7. 流程一直处于Running状态,应该怎么停止?
  8. ra寄存器定位core
  9. C++之指针指向二维数组
  10. 【面向对象】用大白话扯扯那&quot;神奇&quot;的面向对象编程思维(二)