HDU2066:一个人的旅行(Dijkstra)

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

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

const int inf=1<<30;

int T,S,D,n;
int maps[1111][1111];
int vis[1111];
int cast[1111];
int s[1111],e[1111];

void Dijkstra()
{
    int i,j,minn,pos;
    memset(vis,0,sizeof(vis));

    vis[0]=1;

    for(i=0;i<=n;i++)
        cast[i]=maps[0][i];

    for(i=1;i<=n;i++)
    {
        minn=inf;
        for(j=1;j<=n;j++)
        {
            if(cast[j]<minn&&!vis[j])
            {
                pos=j;
                minn=cast[j];
            }
        }
    
    vis[pos]=1;

    for(j=1;j<=n;j++)
    {
        if(cast[pos]+maps[pos][j]<cast[j]&&!vis[j])
            cast[j]=cast[pos]+maps[pos][j];
    }
    }
}
int main()
{
    int i,j,x,y,z,start,end;
    while(~scanf("%d%d%d",&T,&S,&D))
    {
        n = 0;
        for(i = 0; i<1111; i++)
        {
            for(j = 0; j<1111; j++)
                maps[i][j] = inf;
            maps[i][i] = 0;
        }
        while(T--)
        {
            scanf("%d%d%d",&x,&y,&z);
            n = max(max(n,x),y);
            if(z<maps[x][y])
                maps[x][y] = maps[y][x] = z;
        }
        int minn = inf;
        for(i = 0; i<S; i++)
        {
            scanf("%d",&s[i]);
            maps[0][s[i]] = maps[s[i]][0] = 0;
        }
        for(i = 0; i<D; i++)
            scanf("%d",&e[i]);
        Dijkstra();
        for(i = 0; i<D; i++)
            minn = min(minn,cast[e[i]]);
        printf("%d\n",minn);
    }
}

智障了,刚开始以多个源点算的,WA,后来看了题解可以将源点连在一起。

在Dijk。智商-2.

你可能感兴趣的:(HDU2066:一个人的旅行(Dijkstra))