1003. Emergency (25)

#include <iostream>
using namespace std;

#define N 500

struct Node {
	int d;
	int paths;
	int maxteam;
	bool done;
};

int main(int argc, char **argv) {
	int m, n, src, dst, c1, c2;
	int adj[N][N] = {{0}}, team[N] = {0};
	Node NodeList[N] = {0};
	
	cin >> n >> m >> src >> dst;
	
	for(int i = 0; i < n; i ++) {
		cin >> team[i];
		NodeList[i].maxteam = team[i];
	}
	for(int i = 0; i < m; i ++) {
		cin >> c1 >> c2;
		cin >> adj[c1][c2];
		adj[c2][c1] = adj[c1][c2];
	}
	
	int next = src;
	NodeList[src].paths = 1;
	NodeList[src].done = true;
	while(true) {
		for(int i = 0; i < n; i ++) {
			if(adj[next][i] && !NodeList[i].done) {
				int tmpd = NodeList[next].d + adj[next][i];
				if(!NodeList[i].d || tmpd < NodeList[i].d) {
					NodeList[i].paths = NodeList[next].paths;
					NodeList[i].maxteam = NodeList[next].maxteam + team[i];
					NodeList[i].d = tmpd;
				}
				else if(tmpd == NodeList[i].d) {
					NodeList[i].paths += NodeList[next].paths;
					int tmpt = NodeList[next].maxteam + team[i];
					if(tmpt > NodeList[i].maxteam)
						NodeList[i].maxteam = tmpt;
				}
			}
		}
		int minD = 0x7FFFFFFF;
		for(int i = 0; i < n; i ++) {
			if(NodeList[i].d && !NodeList[i].done && NodeList[i].d < minD) {
				next = i;
				minD = NodeList[i].d;
			}
		}
		NodeList[next].done = true;
		if(next == dst) {
			break;
		}
	}
	cout << NodeList[dst].paths << ' ' << NodeList[dst].maxteam << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值