Dijkstra算法加了一点小判断
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<stack>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int book[1011],vis[1011],tm[1011][1011],tm1[1011];
int dis[1011][1001];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&(n||m))
{
int s,e;
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
if(i==j)
{
dis[i][j]=0;
tm[i][j]=0;
}
else
{
dis[i][j]=inf;
tm[i][j]=inf;
}
for(int i=0; i<m; i++)
{
int t1,t2,t3,t4;
scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
if(t3<dis[t1][t2])
{
dis[t1][t2]=t3;
dis[t2][t1]=t3;
tm[t1][t2]=t4;
tm[t2][t1]=t4;
}
}
memset(book,0,sizeof(book));
scanf("%d%d",&s,&e);
book[s]=1;
for(int i=1; i<=n; i++)
{
vis[i]=dis[s][i];
tm1[i]=tm[s][i];
}
for(int i=0; i<n-1; i++)
{
int min1=inf,u;
for(int j=1; j<=n; j++)
{
if(vis[j]<min1&&!book[j])
{
min1=vis[j];
u=j;
}
}
book[u]=1; //printf("ok");
//printf("%d %d..\n",u,vis[u]);
for(int j=1; j<=n; j++)
{
if(vis[j]>vis[u]+dis[u][j]&&!book[j])
{
vis[j]=vis[u]+dis[u][j];
tm1[j]=tm1[u]+tm[u][j];
}
else if(vis[j]==vis[u]+dis[u][j]&&!book[j])
{
if(tm1[j]>tm1[u]+tm[u][j])
tm1[j]=tm1[u]+tm[u][j];
}
}
}
printf("%d %d\n",vis[e],tm1[e]);
}
}