最短路径问题(dijkstra)
原题:hdu3790
这是一道明显但又有点复杂的dijkstra最短路径题,写的时候要设两个数组,一个是距离,一个是费用,算的时候先遍历距离,再在更新数组时先比较距离,距离相同时再比较费用大小,用Floyd的话应该会超时。
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,ma=100000000;
int mp[1050][1050];
int vis[1050];
int dis[1050],cost[1050][1050];
void dijkstra(int l)
{
int mi,pn;
for(int i=1;i<=n;i++)
{
vis[i]=0;
dis[i]=mp[l][i];
}
vis[l]=1;
for(int k=0;k<n;k++)
{
mi=ma;
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&mi>dis[i])
{
mi=dis[i];
pn=i;
}
}
vis[pn]=1;
for(int i=1;i<=n;i++)
{
if(mp[pn][i]<ma&&!vis[i])
{
if(dis[i]>dis[pn]+mp[pn][i])
{
dis[i]=dis[pn]+mp[pn][i];
cost[l][i]=cost[l][pn]+cost[pn][i];
}
else if(dis[i]==dis[pn]+mp[pn][i]&&cost[l][i]>cost[l][pn]+cost[pn][i])
{
cost[l][i]=cost[l][pn]+cost[pn][i];
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
{
mp[i][j]=cost[i][j]=0;
}
else
{
mp[i][j]=cost[i][j]=ma;
}
}
}
int a,b,d,p;
for(int i=0;i<m;i++)
{
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 beg,ed;
scanf("%d%d",&beg,&ed);
dijkstra(beg);
printf("%d %d\n",dis[ed],cost[beg][ed]);
}
return 0;
}