一道前期处理有点麻烦,实际很简单的最短路。
题意:
成语接龙,要求前一个成语的末尾四个字符与后一个成语的前4个字符相等。每一个成语找到下一个成语都有相应的时间,现在要找到到最后一个成语所需要的最短时间。
yy:
可以把只比较前四个和后四个字符。再dijkstra之
#include<stdio.h>
#include<string.h>
#define inf 1000000
#define maxn 100
typedef struct idiom{
int T;
char front[5],tail[5];
}idiom;
int n;
int a[maxn][maxn];
int min[maxn];
int pre[maxn];
int main()
{
void dijkstra(int v0);
idiom id1[maxn];
char str[100];
int i,j,k,t;
while(~scanf("%d",&n))
{
if(n==0) break;
k=0;
for(k=0;k<n;k++)
{
scanf("%d%s",&t,str);
int len=strlen(str);
for(i=0,j=len-1;i<4;i++,j--)
{
id1[k].front[i]=str[i];
id1[k].tail[3-i]=str[j];
}
id1[k].front[4]=id1[k].tail[4]='\0';
id1[k].T=t;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) a[i][j]=0;
else if(strcmp(id1[i].tail,id1[j].front)==0) a[i][j]=id1[i].T;
else a[i][j]=inf;
}
}
dijkstra(0);
if(min[n-1]<inf) printf("%d\n",min[n-1]);
else printf("-1\n");
}
return 0;
}
void dijkstra(int v0)
{
int i,j,k,temp,u,S[maxn];
for(i=0;i<n;i++)
{
S[i]=0;
min[i]=a[v0][i];
if(i!=v0&&min[i]<inf) pre[i]=v0;
else pre[i]=-1;
}
min[v0]=0;
S[v0]=1;
for(i=0;i<n;i++)
{
temp=inf,u=v0;
for(j=0;j<n;j++)
{
if(!S[j]&&min[j]<temp)
{
temp=min[j];
u=j;
}
}
S[u]=1;
for(k=0;k<n;k++)
{
if(!S[k]&&a[u][k]<inf&&min[k]>min[u]+a[u][k])
{
min[k]=a[u][k]+min[u];
pre[k]=u;
}
}
}
}
本来用c++,交上去后编译错误,说对min定义不清,又改成c果断过了,看来c++还很不熟,刚好primer来了,花了我65 个大洋啊.....>_<