#include <stdio.h> #define INF 0x7fffffff #define MAX 1002 struct node { int len,val; }map[MAX][MAX]; int dist[MAX],visited[MAX],cost[MAX]; void Dijkstra(int s,int t,int n) { int i,j,min,u; for (i=1;i<=n;i++) { dist[i]=map[s][i].len; cost[i]=map[s][i].val; visited[i]=0; } visited[s]=1; dist[s]=0; cost[s]=0; for (i=1;i<n;i++) { min=INF; u=i; for(j=1;j<=n;j++) if (!visited[j]&&dist[j]<min) { min=dist[j]; u=j; } visited[u]=1; for(j=1;j<=n;j++) { if (!visited[j]&&map[u][j].len<INF) { if(dist[j]>(map[u][j].len+dist[u])) { dist[j]=map[u][j].len+dist[u]; cost[j]=map[u][j].val+cost[u]; } else if(dist[j]==(map[u][j].len+dist[u])) { if(cost[j]>(map[u][j].val+cost[u])) cost[j]=map[u][j].val+cost[u]; } }//if }//for }//for printf("%d %d\n",dist[t],cost[t]); } int main() { int n,m,i,j,d,p,s,t; while(scanf("%d %d",&n,&m)&&n) { for (i=1;i<=n;i++) { for(j=1;j<=n;j++) { map[i][j].len=INF; map[i][j].val=INF; } } while(m--) { scanf("%d %d %d %d",&i,&j,&d,&p); if(map[i][j].len>d) { map[i][j].len=map[j][i].len=d; map[i][j].val=map[j][i].val=p; } else if(map[i][j].len==d) if(map[i][j].val>p) map[i][j].val=map[j][i].val=p; } scanf("%d %d",&s,&t); Dijkstra(s,t,n); } return 0; }
#include <iostream> #include <queue> #include <cstdio> #define INF 99999999 #define MAX 1002 using namespace std; struct node { int len,val; }map[MAX][MAX]; queue<int> q; int dist[MAX],visited[MAX],cost[MAX]; void init(int n) { int i,j; for (i=1;i<=n;i++) { dist[i]=INF; cost[i]=INF; visited[i]=0; for(j=1;j<=n;j++) { map[i][j].len=INF; map[i][j].val=INF; } } } void SPFA(int s,int t,int n) { int i,j; while(!q.empty()) q.pop(); dist[s]=0; cost[s]=0; q.push(s); visited[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); for (i=1;i<=n;i++) { if((dist[u]+map[u][i].len)<dist[i]) { dist[i]=dist[u]+map[u][i].len; cost[i]=cost[u]+map[u][i].val; if(!visited[i]) { q.push(i); visited[i]=1; } } else if((dist[u]+map[u][i].len)==dist[i]) { if(cost[i]>(map[u][i].val+cost[u])) cost[i]=map[u][i].val+cost[u]; }//else }//for visited[u]=0; } printf("%d %d\n",dist[t],cost[t]); } int main() { int n,m,i,j,d,p,s,t; while(scanf("%d %d",&n,&m)&&n) { init(n);//初始化 while(m--) { scanf("%d %d %d %d",&i,&j,&d,&p); if(map[i][j].len>d) { map[i][j].len=map[j][i].len=d; map[i][j].val=map[j][i].val=p; } else if(map[i][j].len==d) if(map[i][j].val>p) map[i][j].val=map[j][i].val=p; } scanf("%d %d",&s,&t); SPFA(s,t,n); } return 0; }