在一片古老的大地上,虽然商业已经非常繁荣,但是那里的人们仍然延续着古老的交易方式。
他们牵着骆驼在城市之间往来奔波,贩运成批的商品,换来一袋袋的金币。
这片大陆上有N个城市,编号为1„„N。在一些城市之间有路可通,有路就有商队。
但是在不同的城市之间经商所得的收益不同,在下面的这个N=4的例子中,在城市1和城市2之间进行一次交易可以获得40枚金币,在城市2和3之间交易一次可以获得50枚金币,等等。
任务说明 给出这个大陆的地图和每两个城市之间的贸易值(如果这两个城市之间有路可通的话),你需要指挥你的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;否则对这个图的两个连通分量分别执行本算法。