单源最短路径问题
题目大意:有编号为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;
}