成语接龙。
上一个的尾必须和下一个的首相同。注意:花费的时间是上一个。
一开始我就建图建错了。
比如第 i 个成语 与第 j 个成语, 第 i 个成语前面的时间为 t ;
建图为 i -> j = t;
基友说这《图论算法理论、实现及应用》上有一样的题,我借来看了一下,发现它建图似乎有错误。
0->3 这条边的权值似乎错了。
反正我的建图是这样的
0->1=5;0->3=5;
1->2=5;
2->4=7;
3->4=15;
求 0 -> 4 的最短路。
只要建图不错误,就是求一个最短路问题而已。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<iostream>
#define INF 0x7fffffff
using namespace std;
int n,m;
bool vis[1101];
int d[1101];
struct lx
{
int v,t;
};
vector<lx>g[1101];
map<string,int>word;
string str[1001];
int strt[1001];
void SPFA(int start,int thend)
{
for(int i=0;i<1101;i++)
d[i]=INF,vis[i]=0;
queue<int>q;
vis[start]=1,d[start]=0;
q.push(start);
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=0;
for(int j=0;j<g[u].size();j++)
{
int v=g[u][j].v;
int t=g[u][j].t;
if(d[v]>d[u]+t)
{
d[v]=d[u]+t;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
if(d[thend]!=INF)
printf("%d\n",d[thend]);
else puts("-1");
}
void build()
{
int cot=0;
vector<int>head[1001];
for(int i=1;i<=m;i++)
{
string a=str[i].substr(0,4);
if(word[a]==0)
{
word[a]=cot++;
head[word[a]].push_back(i);
}
else
head[word[a]].push_back(i);
}
for(int i=1;i<=m;i++)
{
int len=str[i].length();
string a=str[i].substr(len-4,4);
if(word[a]!=0)
{
lx now;int k=word[a];
for(int j=0;j<head[k].size();j++)
{
now.t=strt[i];
now.v=head[k][j];
g[i].push_back(now);
}
}
}
}
int main()
{
while(scanf("%d",&m),m)
{
for(int i=0;i<1101;i++)
g[i].clear();
word.clear();
for(int i=1;i<=m;i++)
cin>>strt[i]>>str[i];
build();
/*for(int i=1;i<=m;i++)
{
for(int j=0;j<g[i].size();j++)
printf("%d->%d:%d ",i,g[i][j].v,g[i][j].t);
printf("\n");
}*/
SPFA(1,m);
}
}