本题属于比较简单的最短路问题
注:若无向图出现相同边但权值不同要特别判断
#include<stdio.h>
#include<string.h>
#define inf 1e8 + 10
bool vis[1005];
int dis[1005],w[1005];
int a[1005][1005],b[1005][1005];
int n,m;
void Dijkstra(int s,int t)
{
memset(vis,false,sizeof(vis));
for(int i=1; i<=n; i++)
{
dis[i] = a[s][i];
w[i] = b[s][i];
}
vis[s] = true;
for(int i=1; i<=n; i++)
{
int r,q = inf;
for(int j=1; j<=n; j++ )
{
if(!vis[j]&&dis[j]<q)
{
q=dis[r=j];
}
}
vis[r] = true;
for(int j=1; j<=n; j++)
{
if(dis[j]>dis[r]+a[r][j])
{
dis[j] = dis[r] + a[r][j] ;
w[j] = w[r] + b[r][j] ;
}
if(dis[j]==dis[r]+a[r][j])
{
if(w[j]>w[r] + b[r][j])
{
w[j] = w[r] + b[r][j];
}
}
}
}
printf("%d %d\n",dis[t],w[t]);
}
int main()
{
int x,y,d,p,s,t;
while(scanf("%d%d",&n,&m),n+m)
{
memset(a,126,sizeof(a));
memset(b,126,sizeof(b));
for(int i=0; i<m; i++)
{
scanf("%d%d%d%d",&x,&y,&d,&p);
if(a[x][y]>d)//判断出现相同边路费不同不同
{
a[x][y]=a[y][x]=d;
b[x][y]=b[y][x]=p;
}
else if(a[x][y]==d)
{
if(b[x][y]>p)
b[x][y]=b[y][x]=p;
}
}
scanf("%d%d",&s,&t);
Dijkstra(s,t);
}
}