一道前期处理有点麻烦,实际很简单的最短路。
题意:
成语接龙,要求前一个成语的末尾四个字符与后一个成语的前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; } } } }