PAT 甲级 1003 Emergency

没有看清题意把最大的救援队数理解错了然后卡了好久QAQ


#include<iostream>
#include<cstdio>
#include<cstdlib>

using namespace std;

#define maxdis  0x7FFF
#define maxNum 500

int N, M;
int C1, C2;
int rescue[maxNum];
int L[maxNum][maxNum];
int dis[maxNum]; // 表示当前点到源点的最短路径长度
int pathNum[maxNum] = {};     // 记录到当前点有几条路
int teamNum[maxNum] = {}; //到当前点的营救队数目

void Dijkstra() {
	for (int i = 0; i < N; i++) {
		dis[i] = maxdis;
	}
	dis[C1] = 0;
	pathNum[C1] = 1;
	teamNum[C1] = rescue[C1];
	bool vertex[maxNum] = { false };
	vertex[C1] = true;
	int mindis, mindis_index = C1, preIndex;
	for (int j = 0; j < N; j++) {

		mindis = maxdis;
		preIndex = mindis_index; 

		for (int i = 0; i < N; i++) {
			if (!vertex[i] && L[preIndex][i] != 0 && dis[i] > dis[preIndex] + L[preIndex][i]) {
				dis[i] = dis[preIndex] + L[preIndex][i];
				pathNum[i] = pathNum[preIndex];
				teamNum[i] = teamNum[preIndex] + rescue[i];
			}
			else if (!vertex[i] && L[preIndex][i] != 0 && dis[i] == dis[preIndex] + L[preIndex][i]) {	
				pathNum[i] += pathNum[preIndex];
				if (teamNum[preIndex] + rescue[i] > teamNum[i]) 
					teamNum[i] = teamNum[preIndex] + rescue[i];
			}
		}

		for (int k = 0; k < N; k++) {
			if (dis[k] < mindis && !vertex[k]) {
				mindis_index = k;
				mindis = dis[k];
			}
		}
		vertex[mindis_index] = true;
	}
}




int main() {
	cin >> N >> M >> C1 >> C2;
	for (int i = 0; i < N; i++) {
		cin >> rescue[i];
	}
	for (int i = 0; i < M; i++) {
		int first_node, second_node, w;
		cin >> first_node >> second_node;
		cin >> w;
		L[first_node][second_node] = L[second_node][first_node] = w;
	}
	Dijkstra();
	cout << pathNum[C2] << ' ' << teamNum[C2] << endl;

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值