zoukankan      html  css  js  c++  java
  • 题目1008:最短路径问题

    题目1008:最短路径问题

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    题目描述:
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
    输入:
    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
    (1<n<=1000, 0<m<100000, s != t)
    输出:
    输出 一行有两个数, 最短距离及其花费。
    样例输入:
    3 2
    1 2 5 6
    2 3 4 5
    1 3
    0 0
    样例输出:
    9 11
    来源:
    2010年浙江大学计算机及软件工程研究生机试真题
    希望对大家有帮助,也是小根堆。
    #include <iostream>
    #include <stdio.h>
    #include <queue>
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #include <queue>
    #include <set>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <math.h>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std ;
    typedef long long LL ;
    const int Max_N=1008 ;
    const int inf=1000000000 ;
    struct Edge{
        int V ;
        int money ;
        int length ;
        Edge(){} ;
        Edge(int v ,int l ,int m ):V(v),money(m),length(l){} ;
    };
    vector<Edge>vec[Max_N] ;
    int N , M  ,S ,T ;
    int dist[Max_N]  ,Money[Max_N] ;
    struct Node{
         int U ;
         int length ;
         int money ;
         Node(){} ;
         Node(int u ,int l ,int m):U(u),length(l),money(m){} ;
         friend bool operator < (const Node A ,const Node B){
             if(A.length==B.length)
                  return A.money>B.money ;
             else
                  return A.length>B.length ;
         }
    };
    void spfa(){
        priority_queue<Node>que ;
        fill(dist,dist+1+N,inf) ;
        fill(Money,Money+1+N,inf) ;
        que.push(Node(S,0,0)) ;
        dist[S]=Money[S]=0 ;
        while(!que.empty()){
            Node now=que.top() ;
            que.pop() ;
            int u=now.U ;
            if(u==T){
                return ;
            }
    
            for(int i=0;i<vec[u].size() ;i++){
                Edge e=vec[u][i] ;
                int v=e.V ;
                if(now.length+e.length<dist[v]){
                    dist[v]=now.length+e.length ;
                    Money[v]=now.money+e.money ;
                    que.push(Node(v,dist[v],Money[v])) ;
                }
                else if(now.length+e.length==dist[v]){
                    if(Money[v]>now.money+e.money){
                        Money[v]=now.money+e.money ;
                        que.push(Node(v,dist[v],Money[v])) ;
                    }
                }
            }
    
        }
    }
    int main(){
       int u ,v ,len ,money ;
       while(scanf("%d%d",&N,&M)!=EOF){
           if(N==0&&M==0)
              break ;
           for(int i=1 ;i<=N ;i++)
               vec[i].clear()  ;
           while(M--){
               scanf("%d%d%d%d",&u,&v,&len,&money) ;
               vec[u].push_back(Edge(v,len,money)) ;
               vec[v].push_back(Edge(u,len,money)) ;
           }
           scanf("%d%d",&S,&T) ;
           spfa() ;
           printf("%d %d
    ",dist[T],Money[T]) ;
       }
       return 0 ;
    }
  • 相关阅读:
    视频4K技术的解读
    C语言野指针
    获取一个整数所有的质因数(C语言实现)
    乘法口诀表(C语言实现)
    完全平方数(C语言实现)
    Socket网络编程系列教程序
    求1-2/3+3/5-4/7+......49/97和(C语言实现)
    反射
    Cloneable接口和Object的clone()方法
    Comparable和Comparator的区别
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3375213.html
Copyright © 2011-2022 走看看