题目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 ; }