hdu 2066 一个人的旅行(最短路)

题目:

        链接:点击打开链接

题意:

思路:

        对每个起点调用dij算法后,每个终点的最短路长度都已经出来了。对于每个起点,从这些终点的最短路中选出最最短路就可以了。   然后在比较每个终点,即求得最小值。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 100000000

const int N = 2000;

int t,s,d;
int a,b,time;
int map[N][N];
int from[N],to[N];
int dis[N];

int dijkstra(int a)
{
    int vis[N];
    int minn;
    memset(vis,0,sizeof(vis));
    for(int i=1; i<=N; i++)
    {
        dis[i] = map[a][i];
    }
    dis[a] = 0;
    vis[a] = 1;
    for(int i=1; i<N; i++)
    {
        int x;
        minn = INF;
        for(int y=1; y<N; y++)
        {
            if(!vis[y] && dis[y] < minn)
            {
                minn = dis[x=y];
            }
        }
        vis[x] = 1;
        if(minn == INF)
            break;
        for(int y=1; y<=N; y++)
        {
            if(!vis[y] && dis[y] > dis[x] + map[x][y])
                dis[y] = dis[x] + map[x][y];
        }
    }
    minn = INF;
    for(int i=1; i<=d; i++)
    {
        if(minn > dis[to[i]])
        {
            minn = dis[to[i]];
        }
    }
    return minn;
}

int main()
{
    //freopen("input.txt","r",stdin);
    while(scanf("%d%d%d",&t,&s,&d) != EOF)
    {
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<=N; j++)
                map[i][j] = INF;
        }
        for(int i=1; i<=t; i++)
        {
            scanf("%d%d%d",&a,&b,&time);
            if(map[a][b] > time)
                map[a][b] = map[b][a] = time;
        }
        for(int i=1; i<=s; i++)
            scanf("%d",&from[i]);
        for(int i=1; i<=d; i++)
            scanf("%d",&to[i]);
        int minTime = INF;
        for(int i=1; i<=s; i++)
        {
            if(minTime > dijkstra(from[i]))
                minTime = dijkstra(from[i]);
        }
        printf("%d\n",minTime);
    }
    return 0;
}

-----------------------------------------------------------

战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值