现在的位置: 首页 > 综合 > 正文

【贪心】骆驼商队 Camel Trading

2017年10月11日 ⁄ 综合 ⁄ 共 1436字 ⁄ 字号 评论关闭

在一片古老的大地上,虽然商业已经非常繁荣,但是那里的人们仍然延续着古老的交易方式。

他们牵着骆驼在城市之间往来奔波,贩运成批的商品,换来一袋袋的金币。 

这片大陆上有N个城市,编号为1„„N。在一些城市之间有路可通,有路就有商队。

但是在不同的城市之间经商所得的收益不同,在下面的这个N=4的例子中,在城市1和城市2之间进行一次交易可以获得40枚金币,在城市2和3之间交易一次可以获得50枚金币,等等。

在任意两个城市之间,这样的交易只能进行一次。因为你第二次贩运你的商品时,人们 对它们就不会感兴趣了。  现在你只身来到这个大陆上,用有限的资金在每个城市中购买了一支商队。你需要想办法让你的这N支商队给你带来最大的经济收益。

任务说明  给出这个大陆的地图和每两个城市之间的贸易值(如果这两个城市之间有路可通的话),你需要指挥你的N支商队进行一次经商,使得这N支商队在这次经商中获得的总收益最大。

注意:你的每支商队只能进行一次交易,即它们只能从它们所在的城市到达一个相邻的城市。当然,它们也可以不进行任何交易。  

输入数据  

输入文件的第一行有两个整数N(1  N  100)、M(M  0),分别表示这个大陆上的城市数和道路数。  接下来有M行,每行包括三个整数i、j(1  i,j  N且i  j)、v(1  V  10000),表示一条道路的信息。其中i和j表示这条路在城市i和城市j之间,v表示沿着这条路进行一次交易所得的收益。i和j的顺序是无关的,并且任意两个城市之间最多存在一条路。    

输出数据  

你的输出文件应该2行,第1行包含N个整数。其中第k个整数表示你在城市k中的商队将要前往哪个城市进行交易(如果这支商队进行交易的话)或者为0(如果这支商队不进行任何交易)。第2行输出最大收益值。  

  输入输出样例

算法分析】  本题转化成模型就是:在一个无向图中,对于每个点,取一条和它相关联的边(如果这样的边存在的话),使得取出来的所有边的权和最大。  

首先,如果这个图是不连通的,那么它的各个连通分量之间是没有任何联系的。对这些连通分量中的问题可以分别独立地解决,合并起来就是整个问题的解。

所以我们在下面的讨论中假定图是连通的。  

直观地考虑,如果图中存在度为1的点,那么就把这一点上的唯一的一条边分配给这个点(将某条边“分配”给某个点的含义是:将这条边作为和这一点相关联的边取出来,同时这一点就失效了,因为和它相关联的其他边都不能再取了)。

如果不存在这样的点,那么此时有两种情况:一种是边数等于点数,那么这个图就是一个环,这时可以取出图中所有的边;一种是边数大于点数,那么就可以把这个图中权最小的一条边直接删去,因为这条边“显然”不会被取到的。 

 依据这样一个直观思想,本题可以用贪心法来解决。

 贪心算法(用于连通图): 

 1、如果图中只有一个点,直接结束算法。  

2、如果图中存在度为1的点,执行3;否则转4。 

 3、任意找一个度为1的点v,将v上的唯一一条边分配给它。转2。 

4、如果图中的边数等于点数,执行5;否则转6。  

5、设图中的点数(也就是边数)为n。任取一条边e1,将它分配给它的两个端点中的任意

一个v1;然后将v1上的另一条边e2分配给e2的另一个端点v2;将v2上的另一条边e3分配给e3的另一个端点v3;„„如此重复直到将en分配给vn,即图中所有的边都已分配,结束算法。 

 6、将图中权最小的边不分配而直接删去。如果此时图仍然连通,则转2;否则对这个图的两个连通分量分别执行本算法。

抱歉!评论已关闭.