题目链接:
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1001;
const int INF=INT_MAX;
struct Edge{
int to;
int length;
int price;
Edge(int to,int length,int price):to(to),length(length),price(price) {}
};
struct Point{
int number;
int distance;
Point(int number,int distance):number(number),distance(distance) {}
bool operator< (const Point &p) const{
return distance>p.distance;
}
};
vector<Edge> graph[MAXN];
int dis[MAXN];
int cost[MAXN];
void Dijstra(int s){
priority_queue<Point> P;
dis[s]=0;
cost[s]=0;
P.push(Point(s,dis[s]));
while(!P.empty()){
int u=P.top().number;
P.pop();
for(int i=0;i<graph[u].size();i++){
int v=graph[u][i].to;
int d=graph[u][i].length;
int p=graph[u][i].price;
if(dis[v]>dis[u]+d||(dis[v]==dis[u]+d&&cost[v]>cost[u]+p)){
dis[v]=dis[u]+d;
cost[v]=cost[u]+p;
P.push(Point(v,dis[v]));
}
}
}
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0){
break;
}
memset(graph,0,sizeof(graph));
fill(dis,dis+n+1,INF);
fill(cost,cost+n+1,INF);
while(m--){
int a,b,d,p;
scanf("%d%d%d%d",&a,&b,&d,&p);
graph[a].push_back(Edge(b,d,p));
graph[b].push_back(Edge(a,d,p));
}
int s,t;
scanf("%d%d",&s,&t);
Dijstra(s);
printf("%d %d\n",dis[t],cost[t]);
}
return 0;
}