文章

3

粉丝

40

获赞

6

访问

1.5k

头像
最短路径问题(距离+花费)
P1344 浙江大学机试题
发布于2024年6月30日 16:49
阅读数 507

经典dijkstra算法改动:

1)优先队列 q 的排序方法加上花费(钱);

2)增加花费数组 cost,同时更新 dist 和 cost 。

【本质】原比较条件:距离;现比较条件:距离、花费。

#include <bits/stdc++.h>
using namespace std;

#define INF 0x3f3f3f3f
const int maxn = 1005;

struct edge {
    int u, v, w, c;
    edge(int u, int v, int w, int c): u(u), v(v), w(w), c(c) {}
};

struct node {
    int d, m, to;  // 距离,钱,目的地
    node(int d, int m, int to): d(d), m(m), to(to) {}
    friend bool operator < (node A, node B) {
        // 增加一个比较条件:钱
        if (A.d == B.d && A.to == B.to) return A.m < B.m;
        else return A.d > B.d;
    }
};

vector<edge> edges;  // 存储所有边
vector<int> G[maxn];  // 邻接表,存储与顶点u相连接的所有边在edges中的索引
int dist[maxn];  // dist[i]存储从起点到顶点i的最短距离
int cost[maxn];  // cost[i]存储从起点到顶点i的花费
int vis[maxn];  // vis[i]表示顶点i是否已经被访问过
int p[maxn];  // p[i]存储从起点到顶点i的最短路径上,i的前一个顶点

void dijkstra(int s) {
    int i;
    memset(dist, INF, sizeof(dist));
    memset(vis, 0 , sizeof(vis));
 ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发