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

来源:互联网 发布:域名后缀产生 编辑:程序博客网 时间:2024/06/05 18:14

题目:

        链接:点击打开链接

题意:

思路:

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

代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define INF 100000000const 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;}

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

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

0 0