一、技术总结
- 这是一道考查Djiktra算法的题目,主要是求解最短路径的前提下,求每个城市点权的最大值,同时最短路径的条数。
- 只需要在Djikstra算法的基本架构下,添加一些条件即可,点权是添加一个数组weight存储每个点的权值,然后再创建数组w,用于存储。初始化是,除了起点s,w[s]=weight[s],其余都初始化为0,使用memset(w, 0, sizeof(w)),进行初始化。
- 而对于最短路径的条数,设置数组num,然后初始化,num[s] = 1,其余都是初始化为0,memset(num, 0, sizeof(num))。
- 还有就是书写的问题,注意关系。具体参考代码。
二、参考代码
#include<bits/stdc++.h> using namespace std; const int maxn = 510; const int INF = 100000000; int n, G[maxn][maxn]; bool vis[maxn] = {false}; int d[maxn];//用于记录最短路径 int num[maxn];//用于记录最短路径的条数 int weight[maxn];//记录城市中可以调动的人数 int w[maxn]; void Djikstra(int s){ fill(d, d+maxn, INF); memset(num, 0, sizeof(num)); memset(w, 0, sizeof(w)); //fill(num, num+maxn, 0); //fill(w, w+maxn, 0); d[s] = 0; num[s] = 1; w[s] = weight[s]; for(int i = 0; i < n; i++){ int u = -1, MIN = INF; for(int j = 0; j < n; j++){ if(vis[j] == false && d[j] < MIN){ u = j; MIN = d[j]; } } if(u == -1) return; vis[u] = true; for(int v = 0; v < n; v++){ if(vis[v] == false && G[u][v] != INF){ if(d[u] + G[u][v] < d[v]){ d[v] = d[u] + G[u][v]; w[v] = w[u] + weight[v]; num[v] = num[u]; }else if(d[u] + G[u][v] == d[v]){ num[v] += num[u]; if(w[u] + weight[v] > w[v]){ w[v] = w[u] + weight[v]; } } } } } } int main(){ int m, c1, c2; scanf("%d%d%d%d", &n, &m, &c1, &c2); for(int i = 0; i < n; i++){ scanf("%d", &weight[i]); } int id1, id2, L;//城市编号和他们之间的距离 fill(G[0], G[0]+maxn*maxn, INF); for(int i = 0; i < m; i++){ scanf("%d %d %d", &id1, &id2, &L); G[id1][id2] = L; G[id2][id1] = L; } Djikstra(c1); printf("%d %d", num[c2], w[c2]); return 0; }
来源:https://www.cnblogs.com/tsruixi/p/12384951.html