用Dijkstra 加以修改
#include <iostream>
#include<memory.h>
#define INF 0x7fffffff
using namespace std;
int map[503][503];
int cost[503][503];
int mincost[503];
int pre[503];
int dist[503];
int n,s,d,m;
void init1(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j){map[i][j]=0;cost[i][j]=0;}
else{
map[i][j]=INF;
cost[i][j]=INF;
}
}
}
void dijkstra(int n,int d)
{
int visit[503];
int i,j;
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++)
{
dist[i]=map[d][i];
mincost[i]=cost[d][i];
pre[i]=d;
}
mincost[d]=0;//
visit[d]=1;
for(i=0;i<n;i++)
{ int min=INF;
int pos=0;
for(j=0;j<n;j++)
{
if(min>dist[j]&&visit[j]==0)//不可以忘记visit[j]==0
{
min=dist[j];
pos=j;
}
}
visit[pos]=1;
for(j=0;j<n;j++)
{
if(visit[j]==0)
{
if(dist[pos]+map[pos][j]<dist[j]&&map[pos][j]!=INF)
{
dist[j]=dist[pos]+map[pos][j];
pre[j]=pos;
mincost[j]=cost[pos][j]+mincost[pos];
}
else
if(dist[pos]+map[pos][j]==dist[j]&&map[pos][j]!=INF)
if(mincost[j]>mincost[pos]+cost[pos][j])
{ mincost[j]=mincost[pos]+cost[pos][j];
pre[j]=pos;
}
}
}
}
return;
}
int main()
{
int u,v;
int i;
scanf("%d%d%d%d",&n,&m,&s,&d);
init1(n);
while(m--)
{
scanf("%d%d",&u,&v);
int mt,t;
scanf("%d%d",&mt,&t);
map[u][v]=map[v][u]=mt;
cost[u][v]=cost[v][u]=t;
}
dijkstra( n,d);//为了方便后面输出路径所以从目的节点逆回去
for(i=s;i!=d;){
cout<<i<<" ";
i=pre[i];
}
cout<<d;
cout<<" "<<dist[s]<<" "<<mincost[s]<<endl;
return 0;
}
本文介绍了一种基于Dijkstra算法的变种实现方法,该方法用于寻找带权重的图中两点之间的最短路径,并考虑了成本因素。通过C++代码示例详细展示了算法的具体实现过程。
368

被折叠的 条评论
为什么被折叠?



