(2750)ZOJ

来源:互联网 发布:北京软件大学 编辑:程序博客网 时间:2024/06/15 23:35
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>


#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 1009


/*
题意:成语接龙


想法:单源最短路


*/
using namespace std;
int n;
int Edge[MAXN][MAXN];
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
struct node
{
    char f[5];
    char e[5];
    int w;
} p[MAX];


void Dijstra(int v0)
{
    int i,j,k;
    for(i = 0; i<n; i++)
    {
        dist[i] = Edge[v0][i];
        s[i] = 0;
    }
    s[v0] = 1;
    dist[v0] = 0;
    for(i = 0; i<n; i++)
    {
        int min = INF;
        int u = 0;
        for(j = 0; j<n; j++)
        {
            if(!s[j]&&dist[j]<min)
            {
                u = j;
                min = dist[j];
            }
        }
        s[u] = 1;
        for(k = 0; k<n; k++)
        {
            if(!s[k]&&(dist[u]+Edge[u][k]<dist[k])&&Edge[u][k]<INF)
            {
                dist[k] = dist[u]+Edge[u][k];
            }
        }
    }
}
int main()
{
    char str[109];
    int m;
    while(~scanf("%d",&n)&&n)
    {
        for(int i = 0; i<n; i++)
        {
            scanf("%d%s",&p[i].w,str);
            for(int j = 0; j<4; j++)
            {
                p[i].f[j] = str[j];
            }
            p[i].f[4] = '\0';
            int k = 0;
            for(int j = strlen(str) - 4; j<=strlen(str) - 1; j++)
            {
                p[i].e[k++] = str[j];
            }
            p[i].e[k] = '\0';
            //cout<<p[i].f<<"xxxxxxxx"<<p[i].e<<endl;
        }
        for(int i = 0; i<n; i++)
        {
            for(int j = 0; j<n; j++)
            {
                Edge[i][j] = INF;
                if(i==j)continue;
                if(strcmp(p[i].e,p[j].f)==0)
                {
                    Edge[i][j] = p[i].w;
                }
            }
        }
        Dijstra(0);
        if(dist[n-1]==INF) puts("-1");
        else
            printf("%d\n",dist[n-1]);
    }
    return 0;
}
0 0
原创粉丝点击