我终于会了SPFA
#include"iostream"
#include"cstdlib"
#include"cstring"
#include"cstdio"
using namespace std;
int map[1005][1005];
int cost[1005][1005];
int dis[1005];
int val[1005];
int inf=9999999;
int book[1005];
int queue[70000];
int head=1;
int tail=1;
int n,m,s,t;
void spfa()
{
queue[head]=s;
tail++;
book[s]=1;
dis[s]=val[s]=0;
while(head!=tail)
{
int k=queue[head];
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[k]+map[k][i])
{
dis[i]=dis[k]+map[k][i];
val[i]=val[k]+cost[k][i];
if(book[i]==0)
{
queue[tail]=i;
tail++;
book[i]=1;
}
}
else
{
if(dis[i]==dis[k]+map[k][i]&&val[i]>val[k]+cost[k][i])
{
val[i]=val[k]+cost[k][i];
}
}
}
book[queue[head]]=0;
head++;
}
}
int main()
{
while(scanf("%d%d",&n,&m)==2&&n!=0&&m!=0)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=map[j][i]=cost[i][j]=cost[j][i]=inf;
}
}
memset(queue,0,sizeof(queue));
memset(book,0,sizeof(book));
head=tail=1;
for(int i=1;i<=n;i++)
{
dis[i]=val[i]=inf;
}
for(int i=1;i<=m;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(map[a][b]>c)
{
map[a][b]=map[b][a]=c;
cost[a][b]=cost[b][a]=d;
}
else
{
if(map[a][b]==c&&cost[a][b]>d) cost[a][b]=cost[b][a]=d;
}
}
scanf("%d%d",&s,&t);
spfa();
printf("%d %d\n",dis[t],val[t]);
}
return 0;
}