hdu 2066 一个人的旅行(Dijkstra求最短路问题)

这题是我在没学Dijkstra算法时做的,所以跟模板有点不一样,但是意思差不多。如果要看标准的Dijkstra算法的话,可以去查有关知识。

代码如下:

// Time 0ms, Memory 5884K
#include<stdio.h>
#include<string.h>
int map[1200][1200],v1[1200],v2[1200],l,d1[1200],d;
int f(int x)
{
    int i,min,n=0,y,z,m=-1,v[1200];
    memset(d1,-1,sizeof(d1));
    memset(v,-1,sizeof(v));
    y=x;d1[x]=0;
    while(1)
    {
        min=-1;
        for(i=0;i<=l;i++) if(v1[i] && v[i])
        {
            if(map[y][i]!=-1 && (d1[i]==-1 || d1[i]>(d1[y]+map[y][i]))) d1[i]=d1[y]+map[y][i];
            if(min==-1 || (d1[i]!=-1 && min>d1[i]))
            {
                min=d1[i];z=i;
            }
        }
        if(min==-1) return m;
        v[z]=0;y=z;
        if(v2[z]) 
        {
            n++;
            if(m==-1 || m>d1[z]) m=d1[z];
        }
        if(n==d) return m;
    }
}
int main()
{
    int t,s,a,b,i,p[1200],q[1200],min,m1,w;
    while(scanf("%d%d%d",&t,&s,&d)==3)
    {
        memset(map,-1,sizeof(map));
        memset(v1,0,sizeof(v1));
        memset(v2,0,sizeof(v2));
        l=-1;min=-1;
        while(t--)
        {
            scanf("%d%d%d",&a,&b,&w);
            if(map[b][a]==-1 || map[a][b]>w) map[b][a]=map[a][b]=w;
            if(l==-1 || l<a) l=a;
            if(l<b) l=b;
            v1[a]=1;v1[b]=1;
        }
        for(i=0;i<s;i++) 
        {
            scanf("%d",&p[i]);v1[p[i]]=0;
        }
        for(i=0;i<d;i++) 
        {
            scanf("%d",&q[i]);v2[q[i]]=1;
        }
        for(i=0;i<s;i++)
        {
            if(v2[p[i]])
            {
                min=0;break;
            }
            m1=f(p[i]);
            if(min==-1 || (m1!=-1 && min>m1)) min=m1;
        }
        printf("%d\n",min);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/java20130726/p/3218218.html