NYOJ 203 三国志(Dijkstra+贪心)

三国志

时间限制:3000 ms  |  内存限制:65535 KB

难度:5

描写叙述

《三国志》是一款非常经典的经营策略类游戏。我们的小白同学是这款游戏的忠实玩家。如今他把游戏简化一下,地图上仅仅有他一方势力,如今他仅仅有一个城池,而他周边有一些无人占的空城,可是这些空城中有非常多不同数量的同种財宝。

我们的小白同学虎视眈眈的看着这些城池中的財宝。

依照游戏的规则。他仅仅要指派一名武将攻占这座城池,里面的財宝就归他全部了。只是一量攻占这座城池,我们的武将就要留守。不能撤回。由于我们的小白手下有无数的武将,所以他不在乎这些。

从小白的城池派出的武将,每走一公理的距离就要消耗一石的粮食,而他手上的粮食是有限的。如今小白统计出了地图上城池间的道路,这些道路都是双向的。他想请你帮忙计算出他能得到 的最多的財宝数量。我们用城池的编号代表城池,规定小白所在的城池为0号城池。其它的城池从1号開始计数。

输入
本题包括多组数据:

首先,是一个整数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
Dijkstra+贪心算法!
AC码:
#include<stdio.h>
#include<string.h>
#define INF 99999999
int G[105][105],visit[105],num[105];
int dist[105],dp[1000005];
int max(int a,int b)
{
	return a>b?

a:b;
}
int main()
{
	int T,s,n,m,a,b,c,min,i,j,k;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&s,&n,&m);
		for(i=0;i<=n;i++)
		{
			for(j=0;j<=n;j++)
				G[i][j]=INF;
		}
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(G[a][b]>c)         // WA了非常多次,不知道为什么要加这个推断条件
				G[a][b]=G[b][a]=c;   // 创建邻接矩阵
		}
		for(i=1;i<=n;i++)
			scanf("%d",&num[i]);  // 每一个城市的財富值

		// Dijkstra算法求随意两点间的最短路径
		memset(visit,0,sizeof(visit));
		for(i=0;i<=n;i++)
			dist[i]=G[0][i];
		dist[0]=0;
		visit[0]=1;
		for(i=1;i<=n;i++)
		{
			min=INF;
			k=0;
			for(j=0;j<=n;j++)
			{
				if(!visit[j]&&min>dist[j])
				{
					min=dist[j];
					k=j;
				}
			}
			visit[k]=1;
			for(j=0;j<=n;j++)
			{
				if(!visit[j]&&dist[j]>dist[k]+G[k][j])
					dist[j]=dist[k]+G[k][j];
			}
		}// 最短路径求解完成

		// 贪心算法求得最大財富值
		memset(dp,0,sizeof(dp));
		for(i=1;i<=n;i++)
		{
			for(j=s;j>=dist[i];j--)
			{
				dp[j]=max(dp[j],dp[j-dist[i]]+num[i]);
			}
		}
		printf("%d\n",dp[s]);
	}
	return 0;
}

时间: 2024-10-09 19:21:22

NYOJ 203 三国志(Dijkstra+贪心)的相关文章

NYOJ 203 三国志

三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中有很多不同数量的同种财宝.我们的小白同学虎视眈眈的看着这些城池中的财宝. 按照游戏的规则,他只要指派一名武将攻占这座城池,里面的财宝就归他所有了.不过一量攻占这座城池,我们的武将就要留守,不能撤回.因为我们的小白手下有无数的武将,

nyoj 203 三国志(最短路加01背包)

三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中有很多不同数量的同种财宝.我们的小白同学虎视眈眈的看着这些城池中的财宝. 按照游戏的规则,他只要指派一名武将攻占这座城池,里面的财宝就归他所有了.不过一量攻占这座城池,我们的武将就要留守,不能撤回.因为我们的小白手下有无数的武将,

nyoj 三国志 (Dijkstra + 01背包)

... 总是没思路  真要命 注意两点之间可能有多条权值不同的路径,不过只要在输入时取最小值就好了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map>

CCF-交通规划-dijkstra+贪心

交通规划 问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统. 建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成高速铁路.现在,请你为G国国王提供一个方案,将现有的一部分铁路改造成高速铁路,使得任何两个城市间都可以通过高速铁路到达,而且从所有城市乘坐高速铁路到首都的最短路程和原来一样长.请你告诉G国国王在这些条件下最少要改造多长的铁路. 输入格式 输入的第一行包含两个整数n, m,分别表示G国城市的数量和城市

[nyoj]会场安排问题-贪心

会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动.现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排. 输入 第一行是一个整型数m(m<100)表示共有m组测试数据.每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动.随后的n行,每行有

Num 27 : NYOJ : 0448 寻找最大数 [ 贪心 ]

一道经典的贪心问题:如题: 寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次

nyoj 364——田忌赛马——————【贪心】

田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and others." "Both of

NYOJ 915 +-字符串【贪心】

+-字符串 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 Shiva得到了两个只有加号和减号的字符串,字串长度相同.Shiva一次可以把一个加号和它相邻的减号交换.他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串.你现在要去帮助他完成那个这个问题. 输入 多组测试数据 每组数据有两行,每行包含一个由"+"和"-"最成的字符串.每个子符串长度不超过5000. 输出 仅一个整数,输出最少需要操作的次数.如果答案不存在,输出-

nyoj 915 +-字符串(贪心)

+-字符串 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 Shiva得到了两个只有加号和减号的字符串,字串长度相同.Shiva一次可以把一个加号和它相邻的减号交换.他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串.你现在要去帮助他完成那个这个问题. 输入 多组测试数据 每组数据有两行,每行包含一个由"+"和"-"最成的字符串.每个子符串长度不超过5000. 输出 仅一个整数,输出最少需要操作的次数.如果答案不存在,输出-