题目
答案
#include<iostream>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f
int map[501][501],cost[501][501],dis[501],mcost[501],vis[501];
int n,m,start,last;
void init()
{
memset(map,inf,sizeof(map));
memset(cost,inf,sizeof(cost));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
map[i][i]=0;
cin>>n>>m>>start>>last;
while(m--)
{
int x,y,z,money;
cin>>x>>y>>z>>money;
map[x][y]=map[y][x]=z;
cost[x][y]=cost[y][x]=money;
}
for(int i=0;i<n;i++)
{
dis[i]=map[start][i];
mcost[i]=cost[start][i];
}
}
void dijkstra()
{
vis[start]=1;
int min,pos;
int cnt=n-1;
while(cnt--)
{
min=inf;
pos=-1;
for(int i=0;i<n;i++)
{
if(!vis[i]&&dis[i]<min)
{
min=dis[i];
pos=i;
}
}
vis[pos]=1;
for(int i=0;i<n;i++)
{
if(!vis[i]&&dis[pos]+map[pos][i]<dis[i])
{
dis[i]=dis[pos]+map[pos][i];
mcost[i]=mcost[pos]+cost[pos][i];
}
else if(!vis[i]&&dis[pos]+map[pos][i]==dis[i]&&mcost[i]>mcost[pos]+cost[pos][i])
{
mcost[i]=mcost[pos]+cost[pos][i];
}
}
}
}
int main()
{
init();
dijkstra();
cout<<dis[last]<<" "<<mcost[last];
}
总结
这道题在传统的求最短路径的基础上增加了花费的判断,我们只需在每次更新时将mcost也随之更新即可