题意:给出距离和花费,求最短路径,若有多个最短路径,求花费最小的最短路径。
先考虑距离,在距离的基础上考虑花费。注意有重边。原来用模拟栈,一直TLE,改成队列之后就好了。
#include <iostream> #include<cstdio> #include<cmath> #include<cstring> #include<queue> #define N 1100 #define INF 0x7ffffff using namespace std; int d[N],c[N],v[N],cost[N][N],mp[N][N],n,m; void spfa(int s,int t) { for(int i=1;i<=n;i++) c[i]=d[i]=INF,v[i]=0; queue<int> q; q.push(s); d[s]=c[s]=0; v[s]=1; while(!q.empty()) { int tt=q.front(); q.pop(); v[tt]=0; for(int i=1;i<=n;i++) { if(d[i]>d[tt]+mp[tt][i]) { d[i]=d[tt]+mp[tt][i]; c[i]=c[tt]+cost[tt][i]; if(!v[i]) v[i]=1,q.push(i); } else if(d[i]==d[tt]+mp[tt][i]&&c[i]>c[tt]+cost[tt][i]) { c[i]=c[tt]+cost[tt][i]; if(!v[i]) v[i]=1,q.push(i); } } } cout<<d[t]<<' '<<c[t]<<endl; return ; } int main() { while(~scanf("%d%d",&n,&m)&&(n||m)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[i][j]=cost[i][j]=INF; for(int i=0;i<m;i++) { int a,b,d,p; scanf("%d%d%d%d",&a,&b,&d,&p); if(mp[a][b]>d) mp[a][b]=mp[b][a]=d,cost[a][b]=cost[b][a]=p; else if(mp[a][b]==d&&cost[a][b]>p) cost[a][b]=cost[b][a]=p; } int s,t; scanf("%d%d",&s,&t); spfa(s,t); } }