PAT Advanced 1003 【Emergency】 (25)

分析:由于博主水平太菜打算二刷PAT,然而还是一个bug能调一天系列。。画重点审题很重要啊,要求输出有最多救援队员的最短路径(因为之前做过有、印象没理解清题意以为是输出所有最短路径上的总救援人数。。)。And初始化无穷大时,memset可以用0x3f3f3f3f,不能用0x3fffffff,或者直接用fill也行。

const int maxn = 510;
const int inf = 0x3f3f3f3f;
memset(arr, inf, sizeof arr);
//fill(arr[0], arr[0]+maxn*maxn, inf);

AC代码:(之前用的是Dijkstra+Dfs,后来参考了柳神代码直接用Dijkstra,嗯,真香)

#include<iostream>
#include<cstdio>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 510;
const int inf = 0x3f3f3f3f;
int n, m, c1, c2;
int arr[maxn][maxn];
int team[maxn], dis[maxn], vis[maxn], teamn[maxn], cnt[maxn];

void dijkstra(){
	memset(dis, inf, sizeof dis);
//	fill(dis, dis+maxn, inf);
	dis[c1] = 0;
	teamn[c1] = team[c1];
	cnt[c1] = 1;
	while(true){
		int u = -1, minn = inf;
		for(int i = 0; i<n; i++)
			if(dis[i] < minn && !vis[i])
				minn = dis[u = i];
		if(u == -1) break;
		vis[u] = 1;
		for(int v = 0; v<n; v++){
			if(vis[v] || arr[u][v] == inf) continue;
			if(dis[u] + arr[u][v] < dis[v]){
				dis[v] = dis[u] + arr[u][v];
				teamn[v] = teamn[u] + team[v];
				cnt[v] = cnt[u];
			}
			else if(dis[u] + arr[u][v] == dis[v]){
			    cnt[v] += cnt[u];
				teamn[v] = max(teamn[v], teamn[u] + team[v]);				
			}
		}
	}
	
}
int main(){
	int u, v, w; 
	//freopen("aa.txt", "r", stdin);
	ios::sync_with_stdio(false);
	cin >> n >> m >> c1 >> c2;
	for(int i = 0; i<n; i++)
		cin >> team[i];
	memset(arr, inf, sizeof arr);
//	fill(arr[0], arr[0]+maxn*maxn, inf);
	for(int i = 0; i<m; i++){
		cin >> u >> v >> w;
		arr[u][v] = arr[v][u] = w; //唯一
	}
	dijkstra();
	cout << cnt[c2] << " " << teamn[c2] << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/gq__97/article/details/81463326
今日推荐