HDU - 2066 floyd水题

来源:互联网 发布:滨州行知中学官网 编辑:程序博客网 时间:2024/05/01 20:43

hdu - 2066一个人的旅行

题目:

虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。

题意:

就是给你一个图:
然后给你一堆起点,和一堆终点:
然后让你找出所有起点到终点的路径中最短的一个;
没有wa点,就一个是如果用邻接表写的话,没有给出n的范围,需要优化,否则超时,当然你可以重新记下标,就没这么麻烦啦;

思路:

就是一场flody算法:
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
三个for循环,第一个for循环分别表示把k点添加为中介点的情况;
剩下两个for循环枚举路径i->j;
如果dp[i][j]

代码:

#include <iostream>#include <string.h>#include <stdio.h>#include <stdlib.h>#define N 1010#define inf 0x3f3f3f3fusing namespace std;int t,s,d;bool from[N];bool to[N];bool vis[N];int maps[N][N];int n;void floyd(){    int minn=inf;    for(int k=1;k<=n;k++)    {        if(!vis[k])            continue;        for(int i=1;i<=n;i++)        {            if(!vis[i]||maps[i][k]==inf)                continue;            for(int j=1;j<=n;j++)            {                maps[i][j]=(maps[i][j]<maps[i][k]+maps[k][j]?maps[i][j]:maps[i][k]+maps[k][j]);                if(from[i]&&to[j]&&minn>maps[i][j])                    minn=maps[i][j];            }        }    }    printf("%d\n",minn);}int main(){    while(scanf("%d%d%d",&t,&s,&d)!=EOF)    {        int x,y,z;        n=0;        memset(from,0,sizeof(from));        memset(to,0,sizeof(to));        memset(maps,inf,sizeof(maps));        memset(vis,0,sizeof(vis));        for(int i=1;i<=t;i++)        {            scanf("%d%d%d",&x,&y,&z);            n=(n>x? n:x);            n=(n>y? n:y);            vis[x]=vis[y]=true;            maps[x][y]=maps[y][x]=(maps[x][y]<z?maps[x][y]:z);        }        for(int i=1;i<=s;i++)        {            scanf("%d",&x);            from[x]=true;        }        for(int i=1;i<=d;i++)        {            scanf("%d",&x);            to[x]=true;        }        floyd();    }}
0 0
原创粉丝点击