迪杰斯特拉的三小时思考...

#include<bits/stdc++.h>
using namespace std;
const int N = 600,INF=(int)1e9;
int n, m, s, pp;
int d[N],f[N], visited[N],e[N][N],fre[N],num[N],nummax[N],w[N];
void dij() {
fill(d, d + N, INF);
fill(f, f + N, -1);
d[s] = 0; num[s] = 1,nummax[s]=w[s];
for (int i = 0; i < n; i++) {
int u = -1, MIN = INF;
for (int ii = 0; ii < n; ii++) {
if (!visited[ii] && d[ii] < MIN) {
MIN = d[ii];
u = ii;
}
}
if (u == -1) return;
visited[u] = 1;
for (int ii = 0; ii < n; ii++) {
if ((e[u][ii]!=0) && d[u] + e[u][ii] < d[ii]) {//这里的代码是错误的哦
d[ii] = d[u] + e[u][ii];
num[ii] += num[u];
nummax[ii] = nummax[u] + w[ii];
f[ii] = u;
}
else if ((d[u]+ e[u][ii])== d[ii]) {
num[ii] += num[u];
if (nummax[ii] < nummax[u] + w[ii]) {
nummax[ii] = nummax[u] + w[ii];
f[ii] = u;
}
}
}
}
return;
}
int main() {
cin >> n >> m >> s >> pp;
for (int i = 0; i < n; i++){
cin >> w[i];
}
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
e[a][b] = e[b][a] = c;
}
dij();
cout << num[pp] << " " << nummax[pp] << endl;
int index = s;
for (int i = 0; i <= n; i++) {
if (f[i] != pp) {
cout << f[index]<<" ";
index = f[index];
}
else
cout << pp;
}
}
这道题出现了诸多难点以及令我出错的点

浙公网安备 33010602011771号