hdoj-2066 一个人的旅行【最短路径--dijkstra&&spfa&&floyd】

来源:互联网 发布:js中get post 区别 编辑:程序博客网 时间:2024/06/04 18:34

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

解题思路:

把城市a,b看成起点和终点,time看成两者之间的距离      从而转化成最短路径问题

该题中有多个起点终点    求出每个起点到每个终点的最短路径   取在这些最短路径中的最小值

注意:本题没有给出城镇的个数n  但floyd中刻画第几个节点时会用到    所以需要自己去找


floyd;

#include<cstdio>#include<cstring>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int n,t,s,d,path[1010][1010];//path[]两城镇之间的距离void getmap(){    int a,b,time;    n=0;    memset(path,INF,sizeof(path));// 初始化   一开始先默认两城市无道路连通  距离为 无穷大    while(t--)    {        scanf("%d%d%d",&a,&b,&time);       <span style="color:#ff0000;"> if(n<max(a,b))//找城市个数            n=max(a,b</span>);        if(path[a][b]>time)            path[a][b]=path[b][a]=time;    } }void floyd(){    int i,j,k;    for(k=1;k<=n;k++)        for(i=1;i<=n;i++)           <span style="color:#ff0000;"> if(path[i][k]!=INF</span>)//or  if(path[i][j]==INF)continue;进行下一组数据      优化   否则TLE(超时)            {                for(j=1;j<=n;j++)                {                    if(path[i][j]>path[i][k]+path[k][j])                        path[i][j]=path[i][k]+path[k][j];                            }            }}int main(){    int start[1010],end[1010],i,j;    while(~scanf("%d%d%d",&t,&s,&d))    {        getmap();        for(i=0;i<s;i++)            scanf("%d",&start[i]);        for(i=0;i<d;i++)            scanf("%d",&end[i]);        floyd();       <span style="color:#ff0000;"> int min=INF;        for(i=0;i<s;i++)        {            for(j=0;j<d;j++)             {                if(min>path[start[i]][end[j]])                    min=path[start[i]][end[j]];            }        }</span>        printf("%d\n",min);    }     return 0;}


0 0
原创粉丝点击