• HDU 3790 最短路径问题 (dijkstra)


    最短路径问题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 29549    Accepted Submission(s): 8761


    Problem Description
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
     
    Input
    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
    (1<n<=1000, 0<m<100000, s != t)
     
    Output
    输出 一行有两个数, 最短距离及其花费。
     
    Sample Input
    3 2 1 2 5 6 2 3 4 5 1 3 0 0
     
    Sample Output
    9 11
     
    Source
     
    Recommend
    notonlysuccess   |   We have carefully selected several similar problems for you:  2544 2066 1217 2112 1142 
     
    分析:基础的最短路问题,在路径长度相同的情况下,要多更新一下价格。
    另外要注意的是有重边
     
    代码如下:
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <map>
    #include <algorithm>
    using namespace std;
    #define INF 0x3f3f3f3f
    int path [1010][1010];
    int cost[1010][1010];
    int s,t,n,m,u,v,val,long1;
    int dis[1010];
    int co[1010];
    int vis[1010];
    void djs(int s,int t)
    {
        fill(co,co+n+1,INF);
        fill(dis,dis+n+1,INF);
        co[s]=0;
        dis[s]=0;
        while(1)
        {
           int u=-1;
           for(int i=1;i<=n;i++)
           if(!vis[i]&&(u==-1||dis[i]<dis[u]))u=i;
           if(u==-1)break;
           vis[u]=1;
    
           for(int i=1;i<=n;i++)
           {
              if(path[u][i]==-1)continue;
              if(dis[i]>dis[u]+path[u][i])
              {
                  dis[i]=dis[u]+path[u][i];
                  co[i]=co[u]+cost[u][i];
              }
              else if(dis[i]==dis[u]+path[u][i])
                 co[i]=min(co[i],co[u]+cost[u][i]);
           }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0&&m==0)break;
          memset(path,-1,sizeof(path));
          memset(cost,-1,sizeof(cost));
          memset(vis,0,sizeof(vis));
          for(int i=0;i<m;i++)
          {
             scanf("%d%d%d%d",&u,&v,&long1,&val);
             if(long1<path[u][v]||path[u][v]==-1){
             path[u][v]=long1;
             cost[u][v]=val;
             path[v][u]=long1;
             cost[v][u]=val;
             }
          }
           scanf("%d%d",&s,&t);
           djs(s,t);
          printf("%d %d
    ",dis[t],co[t]);
        }
        return 0;
    }
  • 相关阅读:
    控制结构(Scala)
    《基于Spark的大数据访存行为跨层分析工具》学习笔记
    函数式对象(Scala)
    心脏病预测(SVM模型)
    类、对象、基础类型、操作(Scala)
    ElementUI对话框(dialog)提取为子组件
    ElementUI+命名视图实现复杂顶部和左侧导航栏
    ElementUI 复杂顶部和左侧导航栏实现
    Vue页面手动刷新,导航栏激活项还原到初始状态问题解决方案
    elementUI动态数据表格(带分页)
  • 原文地址:https://www.cnblogs.com/a249189046/p/7488776.html
Copyright © 2020-2023  润新知