题目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 ;
}
原文地址:https://www.cnblogs.com/liyangtianmen/p/3375213.html