注意:1.有重边的情况。
2.要判断两种情况,路径相同时判断花费的多少。
#include<stdio.h>
#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<list>
#include<vector>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define INF 1000000
#define MAX 1005
int main()
{
int dis[MAX],cost[MAX][MAX],visit[MAX],map[MAX][MAX],cos[MAX];
int n,m;
int a,b,d,p;
int i,j,s,t,min,pre,k;
while(scanf("%d%d",&n,&m),n||m)
{
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
map[i][j]=INF;
cost[i][j]=INF;
}
}
for(i=0;i<MAX;i++)
{
visit[i]=0;
}
for (i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(d<map[a][b])
{
map[a][b]=map[b][a]=d;
cost[a][b]=cost[b][a]=p;
}
else if(d==map[a][b] && p<cost[a][b])
{
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&s,&t);
visit[s]=1;
for (j=1;j<=n;j++)
{
dis[j]=map[s][j];
cos[j]=cost[s][j];
}
for (i=1;i<=n;i++)
{
min=INF;
for (j=1;j<=n;j++)
{
if(!visit[j] && min>dis[j])
{
min=dis[j];
pre=j;
}
}
visit[pre]=1;
for (k=1;k<=n;k++)
{
if(!visit[k] && dis[k] > dis[pre]+map[pre][k])
{
dis[k]=dis[pre]+map[pre][k];
cos[k]=cos[pre]+cost[pre][k];
}
else
if(!visit[k]&&dis[k]==dis[pre]+map[pre][k]&&cos[k]>cos[pre]+cost[pre][k])//路径相同时判断花费的多少
{
cos[k]=cos[pre]+cost[pre][k];
}
}
}
printf("%d %d\n",dis[t],cos[t]);
}
return 0;
}