zoj 2750 Idiomatic Phrases Game(最短路)

一道前期处理有点麻烦,实际很简单的最短路。

题意:

成语接龙,要求前一个成语的末尾四个字符与后一个成语的前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 个大洋啊.....>_<



你可能感兴趣的:(zoj 2750 Idiomatic Phrases Game(最短路))