1003. Emergency

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#define MAX 500
#define INF 99999
using namespace std;

int sumLength, minLength, sumTeam, maxTeam, sumCount;
struct Graph {
	int cityNumber;
	int roadNumber;
	int rescueTeam[MAX];
	int road[MAX][MAX];
	bool visit[MAX];
};

void InitialGraph(Graph &graph,int &start, int &goal);
void dfs(Graph &graph, int start, int goal);

int main() {
	freopen("D://input.txt", "r", stdin);
	Graph graph;
	int start, goal;
	InitialGraph(graph, start, goal);

	minLength = INF, sumLength = 0, sumCount = 0;
	maxTeam = sumTeam = graph.rescueTeam[start];
	graph.visit[start] = true;
	dfs(graph, start, goal);

	cout << sumCount << " " << maxTeam << endl;
	return 0;
}

void InitialGraph(Graph &graph, int &start, int &goal) {
	int i, j;
	cin >> graph.cityNumber >> graph.roadNumber >> start >> goal;
	for (i = 0; i < graph.cityNumber; i++) {
		cin >> graph.rescueTeam[i];
		graph.visit[i] = false;
	}
	
	for (i = 0; i < graph.cityNumber; i++) 
		for (j = 0; j < graph.cityNumber; j++) 
			graph.road[i][j] = INF;

	for (i = 0; i < graph.roadNumber; i++) {
		int c1, c2, l;
		cin >> c1 >> c2 >> l;
		graph.road[c1][c2] = graph.road[c2][c1] = l;
	}
	return;
}
void dfs(Graph &graph, int start, int goal) {
	int i;
	if (sumLength > minLength)
		return;
	if (start == goal) {
		if (sumLength < minLength) {
			minLength = sumLength;
			maxTeam = sumTeam;
			sumCount = 1;
		}
		else if (sumLength == minLength) {
			if (sumTeam > maxTeam)
				maxTeam = sumTeam;
			sumCount++;
		}
		return;
	}
	for (i = 0; i < graph.cityNumber; i++) {
		if (!graph.visit[i]&&graph.road[start][i]<INF) {
			graph.visit[i] = true;
			sumLength += graph.road[start][i];
			sumTeam += graph.rescueTeam[i];
			dfs(graph, i, goal);
			graph.visit[i] = false;
			sumLength -= graph.road[start][i];
			sumTeam -= graph.rescueTeam[i];
		}
	}
	return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值