NYOJ 203-三國志

點擊打開連接php

三國志

時間限制: 3000 ms  |  內存限制: 65535 KB
難度: 5
描述

《三國志》是一款很經典的經營策略類遊戲。咱們的小白同窗是這款遊戲的忠實玩家。如今他把遊戲簡化一下,地圖上只有他一方勢力,如今他只有一個城池,而他周邊有一些無人佔的空城,可是這些空城中有不少不一樣數量的同種財寶。咱們的小白同窗虎視眈眈的看着這些城池中的財寶。測試

按照遊戲的規則,他只要指派一名武將攻佔這座城池,裏面的財寶就歸他全部了。不過一量攻佔這座城池,咱們的武將就要留守,不能撤回。由於咱們的小白手下有無數的武將,因此他不在意這些。spa

從小白的城池派出的武將,每走一公理的距離就要消耗一石的糧食,而他手上的糧食是有限的。如今小白統計出了地圖上城池間的道路,這些道路都是雙向的,他想請你幫忙計算出他能獲得 的最多的財寶數量。咱們用城池的編號表明城池,規定小白所在的城池爲0號城池,其餘的城池從1號開始計數。.net

輸入
本題包含多組數據:
首先,是一個整數T(1<=T<=20),表明數據的組數
而後,下面是T組測試數據。對於每組數據包含三行:
第一行:三個數字S,N,M
(1<=S<=1000000,1<=N<=100,1<=M<=10000)
S表明他手中的糧食(石),N表明城池個數,M表明道路條數。
第二行:包含M個三元組行 Ai,Bi,Ci(1<=A,B<=N,1<=C<=100)。
表明Ai,Bi兩城池間的道路長度爲Ci(千米)。
第三行:包含N個元素,Vi表明第i個城池中的財寶數量。(1<=V<=100)
輸出
每組輸出各佔一行,輸出僅一個整數,表示小白能獲得的最大財富值。
樣例輸入
2
10 1 1
0 1 3
2
5 2 3
0 1 2 0 2 4 1 2 1
2 3
樣例輸出
2
5


用迪傑斯特拉求最短路徑,而後用最基本的01揹包求出最大收益,注意題目中有重邊,取最小的那個邊,這讓我錯了一天!!一成天啥也沒幹,靠!


#include<stdio.h>
#include<string.h>
int map[110][110];
int cost[110];
int value[110];
int n;
int dp[1000010];
bool used[110];
void dij()
{
	memset(cost, 127, sizeof(cost));
	cost[0] = 0;
	memset(used, 0, sizeof(used));
	int i, j;
	int mark , min;
	for(i = 0; i <= n; i++)
	{
		min = 0x7fffffff;
		mark = 0;
		for(j = 0; j <= n; j++)
		{
			if(used[j] == 0)
			{
				if(cost[j] < min)
				{
					min = cost[j];
					mark = j;
				}
			}
		}
		used[mark] = 1;
		for(j = 1; j <= n; j++)
		{
			if(map[mark][j] < 100000000 && !used[j])
			{
				cost[j] = cost[j] > (cost[mark] + map[mark][j]) ? (cost[mark] + map[mark][j]) : cost[j];
			}
		}
	}
}
int main()
{
//	freopen("test.txt", "r", stdin);
	int t;
	scanf("%d", &t);
	while(t--)
	{
		int s, m;
		memset(map, 127, sizeof(map));
		memset(value, 0, sizeof(value));
		memset(dp, 0, sizeof(dp));
		scanf("%d%d%d", &s, &n, &m);
		int i;
		int S, E, l;
		for(i = 0; i < m; i++)
		{
			scanf("%d%d%d", &S, &E, &l);
			map[S][E] = map[S][E] > l ? l : map[S][E];
			map[E][S] = map[S][E];
		}
		for(i = 1; i <= n; i++)
		{
			scanf("%d", &l);
			value[i] = l;
		}
		dij();
		int j;
		for(i = 1; i <= n; i++)
		{
			for(j = s; j - cost[i] >= 0; j--)
			{
				dp[j] = dp[j] > (dp[j - cost[i]] + value[i]) ? dp[j] : (dp[j - cost[i]] + value[i]);
			}
		}
		printf("%d\n", dp[s]);
	}
	return 0;
}
相關文章
相關標籤/搜索