单源最短路径问题
题目大意:有编号为1到n的城市,和m条道路,每条道路有距离和价钱,求从起始点到终点的最短距离,如果最短距离有多条,求出花费最少的那条路径,输出最短距离和花费的价格。
Dijkstra算法,只需在求最短路径时把花费纪录一下就行了,当有多条最短路径时找出最低价格。
#include <cstdio> #include <iostream> #include <cstring> #define MAX 1010 #define INF 999999999 using namespace std; bool s[MAX]; int dist[MAX],cost[MAX],ansd[MAX][MAX],ansc[MAX][MAX]; void Dijkstra(int v,int n) { int temp,u,i,j; for(i=1;i<=n;i++) { dist[i]=ansd[v][i]; cost[i]=ansc[v][i]; s[i]=false; } dist[v]=cost[v]=0; s[v]=true; for(i=2;i<=n;i++) { temp=INF; u=v; for(j=1;j<=n;j++) if(!s[j]&&dist[j]<temp) { u=j; temp=dist[j]; } s[u]=true; for(j=1;j<=n;j++) if(!s[j]&&dist[j]>dist[u]+ansd[u][j]) { dist[j]=dist[u]+ansd[u][j]; cost[j]=cost[u]+ansc[u][j]; } else if(!s[j]&&dist[j]==dist[u]+ansd[u][j]&&cost[j]>cost[u]+ansc[u][j]) cost[j]=cost[u]+ansc[u][j]; } } int main() { int n,m,start,end; int a,b,d,p,i,j; while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(i=0;i<=n;i++) for(j=0;j<=n;j++) ansc[i][j]=ansd[i][j]=INF; for(i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(ansd[a][b]>d||(ansd[a][b]==d&&ansc[a][b]>p)) { ansd[a][b]=ansd[b][a]=d; ansc[a][b]=ansc[b][a]=p; } } scanf("%d%d",&start,&end); Dijkstra(start,n); printf("%d %d\n",dist[end],cost[end]); } return 0; }