这道题卡了有点久,今晚基本搞懂了。代码注释比较全,有问题欢迎指正ヽ( ̄▽ ̄)ノ
#include<bits/stdc++.h>
#define maxv 500+8
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int mmp[maxv][maxv]; // 地图
int w[maxv]; // 救援队数量
int dis[maxv]; // dijkstra各点到源点的最近距离
int cnt[maxv]; // 源点到各点最近距离相同的路径条数
int summ[maxv]; // 从源点走到各点可召集的消防员的最大值
int pre[maxv]; // 该点的前驱节点(左节点)
bool used[maxv]; // 访问标志,标志了该点是否被访问
int V,E,S,D;
void path(int k) {
if(k<0)
return;
path(pre[k]);
if(k!=S){
cout<<" ";
}
cout<<k;
}
void dijkstra(int s) {
fill(dis,dis+V,INF);
fill(used,used+V,false);
fill(pre,pre+V,-1);
// 初始情况,起点到起点
dis[s] = 0;
summ[s]= w[s