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

#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;
	}
}

这道题出现了诸多难点以及令我出错的点

posted @ 2025-03-05 19:05  ghostyu1  阅读(15)  评论(0)    收藏  举报