3 2 1 2 5 6 2 3 4 5 1 3 0 0
9 11
#include#include #define max 1010 #define INF 0x3f3f3f int map[max][max],map_cost[max][max],n; void dijkstra(int start,int end) { int dis[max],visit[max],cost[max]; int i,j,min,next=start; for(i=1;i<=n;++i) { dis[i]=map[start][i]; cost[i]=map_cost[start][i]; visit[i]=0; } visit[start]=1; for(i=1;i<=n;++i) { min=INF; for(j=1;j<=n;++j) { if(!visit[j]&&min>dis[j]) { next=j; min=dis[j]; } } visit[next]=1; for(j=1;j<=n;++j) { if(!visit[j]) { if(dis[j]>dis[next]+map[next][j]) { dis[j]=dis[next]+map[next][j]; cost[j]=cost[next]+map_cost[next][j]; } else if(dis[j]==dis[next]+map[next][j]&&cost[j]>cost[next]+map_cost[next][j]) cost[j]=cost[next]+map_cost[next][j]; } } } printf(%d %d ,dis[end],cost[end]); } int main() { int m,i,j,a,b,d,p,start,end; while(scanf(%d%d,&n,&m)&&n||m) { for(i=1;i<=n;++i) { for(j=1;j<=n;++j) { if(i==j) map[i][j]=map_cost[i][j]=0; else map[i][j]=map_cost[i][j]=INF; } } while(m--) { scanf(%d%d%d%d,&a,&b,&d,&p); if(map[a][b]>d) { map[a][b]=map[b][a]=d; map_cost[a][b]=map_cost[b][a]=p; } if(map[a][b]==d&&map_cost[a][b]>p) map_cost[a][b]=map_cost[b][a]=p; } scanf(%d%d,&start,&end); dijkstra(start,end); } return 0; }