topic:
analysis:
This title belongs to the shortest path problem, you can use Dijkstra solved, but to more than one condition: When the case of equal distance, to determine how to spend less money.
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 505;
int mat[MAXN][MAXN],dis[MAXN],mon[MAXN],mm[MAXN][MAXN];
bool vis[MAXN];
int n,m,s,d;
struct node
{
int pos,cost;
}no[MAXN];
priority_queue<node> q;
bool operator<(const node &n1,const node &n2)
{
return n1.cost > n2.cost;
}
void Dijkstra(int x)
{
dis[x] = 0;
mon[x] = 0;
q.push({x,0});
while(!q.empty())
{
node now = q.top();
q.pop();
if(!vis[now.pos])
{
vis[now.pos] = true;
for(int i=0;i<n;++i)
if(mat[now.pos][i]&&!vis[i])
{
if(dis[now.pos]+mat[now.pos][i] < dis[i])
{
dis[i] = dis[now.pos]+mat[now.pos][i];
mon[i] = mon[now.pos]+mm[now.pos][i];
q.push({i,dis[i]});
}
else
if(dis[now.pos]+mat[now.pos][i] == dis[i]) //距离相等的情况下判断哪一条路径花的钱更少
mon[i] = min(mon[i],mon[now.pos]+mm[now.pos][i]);
}
}
}
}
int main()
{
int x,y,len,money;
scanf("%d%d%d%d",&n,&m,&s,&d);
memset(dis,INF,sizeof(dis));
memset(mon,INF,sizeof(mon));
for(int i=1;i<=m;++i)
{
scanf("%d%d%d%d",&x,&y,&len,&money);
mat[x][y] = len;
mat[y][x] = len;
mm[x][y] = money;
mm[y][x] = money;
}
Dijkstra(s);
printf("%d %d\n",dis[d],mon[d]);
return 0;
}