hdu 2066 一个人的旅行

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2066

题目分类:dijkstra算法

错误点:不知道点的范围

代码

#include<bits/stdc++.h>

using namespace std;

#define INF 10000000

const int maxv=2000;

int cost[maxv][maxv];
int d[maxv];
bool vis[maxv];

int x[2000];
int y[2000];
int path[2000];


int e,s,di;
int a,b,tt;
int ans;
int ver;

void dijkstra(int n,int st)
{
    int i,j,minn,pre;
    memset(vis,0,sizeof(vis));

    vis[st]=1;

    for(i=0;i<n;i++)
    {
        d[i]=cost[st][i];
        path[i]=st;
    }

    d[st]=0;
    path[st]=-1;
    pre=st;

    for(i=1;i<n;i++)
    {
        for(j=1;j<n;j++)
        {
            if(vis[j]==0&&d[pre]+cost[pre][j]<d[j])
                d[j]=d[pre]+cost[pre][j],path[j]=pre;
        }
        minn=INF;
        for(j=1;j<n;j++)
        {
            if(vis[j]==0&&d[j]<minn)
                minn=d[j],pre=j;
        }
        vis[pre]=1;
    }
    return ;
}


int main()
{
    while(scanf("%d %d %d",&e,&s,&di)!=EOF)
    {
        for(int i=0;i<1200;i++)
        {
            for(int j=0;j<1200;j++)
            {
                cost[i][j]=INF;
            }
            cost[i][i]=0;
        }

        ver=0;

        for(int i=0;i<e;i++)
        {
            scanf("%d %d %d",&a,&b,&tt);


            cost[a][b]=min(tt,cost[a][b]);
            cost[b][a]=min(tt,cost[a][b]);

            ver=max(max(ver,a),b);
        }

        for(int i=0;i<s;i++)
        {
            scanf("%d",&x[i]);
            cost[0][x[i]]=0;
            cost[x[i]][0]=0;
        }

        for(int i=0;i<di;i++)
        {
            scanf("%d",&y[i]);
        }

        ans=INF;

        dijkstra(ver+1,0);

        for(int j=0;j<di;j++)
        {
            ans=min(ans,d[y[j]]);
        }

        printf("%d
",ans);

    }
    return 0;
}