zoj2750(最短路径)

来源:互联网 发布:dota2天梯各分段 知乎 编辑:程序博客网 时间:2024/05/16 08:52

题目大意:成语接龙,从第一个到最后一个点的最短路径

//选择建图的方式真的很重要,偷个懒,用dfs#include<cstdio>#include<iostream>#include<cstring>using namespace std;struct Edge{    int to,w,next;} edges[1000000];const int mn=1001;int n,m,w[mn];char s[100],a[mn][5],b[mn][5];//a记录前4个字母,b记录后4个字母int vis[mn];//记录一条路径上的结点int dis[mn];//记录距离int head[mn];void add(int i,int j){    edges[m].to=j;    edges[m].w=w[i];    edges[m].next=head[i];    head[i]=m++;}void dfs(int i){    for(int j=head[i]; ~j; j=edges[j].next)    {        int v=edges[j].to;        if(dis[v]>dis[i]+edges[j].w)        {            dis[v]=dis[i]+edges[j].w;            vis[v]=1;            dfs(v);            vis[v]=0;        }    }}int main(){    while(~scanf("%d",&n)&&n)    {        for(int i=0; i<n; ++i)        {            scanf("%d%s",w+i,s);            int len=strlen(s);            memcpy(a[i],s,4);            memcpy(b[i],s+len-4,4);        }        //建图        memset(head,-1,sizeof(head));        m=0;        for(int i=0; i<n; ++i)            for(int j=0; j<n; ++j)                if(i!=j&&!strcmp(b[i],a[j]))//i不等于j并且i到j可以直接连接                    add(i,j);        memset(vis,0,sizeof(vis));        memset(dis,6,sizeof(dis));        dis[0]=0;        vis[0]=1;        dfs(0);        if(dis[n-1]==dis[1000]) printf("-1\n");        else printf("%d\n",dis[n-1]);    }    return 0;}


原创粉丝点击