1003 Emergency (25 分)

Original title:
https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376

#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
int city, road, c1, c2;
int rescue_nums[505];
int edge[505][505];
int dist[505];
bool visit[505];
int max_rescue_nums[505];
int road_nums[505];

int main() {
	cin >> city >> road >> c1 >> c2;
	fill(edge[0], edge[0] + 505 * 505, INF);
	fill(dist, dist + 505, INF);
	for (int i = 0; i < city; i++) {
		cin >> rescue_nums[i];
	}
	int t1, t2, t3;
	for (int i = 0; i < road; i++) {
		cin >> t1 >> t2 >> t3;
		edge[t1][t2] = edge[t2][t1] = t3;
	}

	dist[c1] = 0;
	max_rescue_nums[c1] = rescue_nums[c1];
	road_nums[c1] = 1;
	for (int i = 0; i < city; i++){
		//下面这个for循环在干嘛呢?
		int u = -1, minn = INF;
		for (int j = 0; j < city; j++){
			if (visit[j] == false && dist[j] < minn) {
				u = j;
				minn = dist[j];
			}
		}
		if (u == -1) break;
		visit[u] = true;
		for (int v = 0; v < city; v++)
		{
			if (visit[v] == false && edge[u][v] != INF) {
				if (dist[u]+ edge[u][v] < dist[v]){
					dist[v] = dist[u] + edge[u][v];
					road_nums[v] = road_nums[u];
					max_rescue_nums[v] = max_rescue_nums[u] + rescue_nums[v];
				}else if (dist[u] + edge[u][v] == dist[v]){
					road_nums[v] += road_nums[u];
					if (max_rescue_nums[u] + rescue_nums[v] > max_rescue_nums[v]) {
						max_rescue_nums[v] = max_rescue_nums[u] + rescue_nums[v];
					}
				}

			}
		}

	}
	cout << road_nums[c2] << " " << max_rescue_nums[c2];
	return 0;
}


Guess you like

Origin blog.csdn.net/STU17xkx/article/details/94575215