hdu1546Idiomatic Phrases Game(floyd+map)
2024-10-19 17:18:12
成语接龙,找每个单词都需要一点时间,问最少的时间
把字符串用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 ;
}
最新文章
- 使用jOrgChart插件实现组织架构图的展示
- POJ 2352 Stars 线段树
- 16-01-25---Servlet复习笔记(01)
- 【bzoj2318】Spoj4060 game with probability Problem
- [iOS]浅谈NSRunloop工作原理和相关应用
- 如何用js刷新aspxgridviw
- WCDMA是什么意思?CDMA是什么意思?GSM是什么意思
- Java Observable 模式
- bzoj3039
- thinkphp分页时修改last显示标题
- Storyboard 经常用法总结-精华版
- Git使用详细教程(9):git log
- 我的mybatis从oracle迁移转换mysql的差异【原】
- 题解 P3246 【[HNOI2016]序列】
- gradle3.0新命令
- Oracle 故障整理
- C# 多线程八之并行Linq(ParallelEnumerable)
- 微信公众号DOM的一个坑
- Codeforces Round #530 (Div. 2) F - Cookies
- 深入jetty的使用详解