JZOJ 1769.Islands and Bridges

Description

 给定一些岛屿和一些连接岛屿的桥梁,大家都知道汉密尔顿路是访问每个岛屿一次的路线,在我们这个地图中,每个岛屿有个正整数的权值,表示这个岛屿的观赏价值。假设一共有N个岛屿,用Vi表示岛屿Ci的价值,汉密尔顿路C1C2….Cn的价值是以下三部分的总和:
  (1)所有岛屿的价值之和;
  (2)对于路径中相邻的两个岛屿CiCi+1,把两个岛屿的价值之积加到总价值中;
  (3)路径中连续三个岛屿CiCi+1Ci+2,如果Ci与Ci+2有桥直接相连,则把这三个岛屿价值之积加到总价值中。
  要求计算汉密尔顿路最大的价值以及方案数。
Input
 输入第一行是一个整数Q(Q<=20),表示测试数据的数量。每个测试数据第一行输入两个整数N和M,分别表示岛屿数和桥梁数,接下来一行包含N个正整数,第i个数表示Vi,每个数不超过100,最后M行,每行两个数X,Y,表示岛X和岛Y之间有一座桥直接相连,桥是双向的,岛屿编号为1到N(N<=13)
Output
  对于每个测试数据,输出一行,两个整数,第一个数表示最大价值,第二个数表示方案数,如果不存在汉密尔顿路径,输出“0 0”
  注意:一条路径可以反着走,我们认为这两条路径是同一条路径。

Sample Input

2
3 3
2 2 2
1 2
2 3
3 1
4 6
1 2 3 4
1 2
1 3
1 4
2 3
2 4
3 4

Sample Output

22 3
69 1

Solution

我们设F[k,i,j]表示状态为k(一个2进制数),i表示j是从i走过来的,l表示将要从j走到l
其中要保证i&k>0且j&k>0且l&k=0(k表示已走过哪些点,则其中i,j已走过,所以会在k中记录,而l还没有走到,所以k中没有l)
我们还要设定一个g数组,其中g[k,i,j]表示状态为k(一个2进制数),i表示j是从i走过来的,l表示将要从j走到l的方案数。
那么状态转移方程很显然,
就是f[k+2^l,j,l]=max(f[k+2^l,j,l],f[k,i,j]+a[i,l]*(v[i]*v[j]*v[l])+v[j]*v[l]+v[l])
如果两者相等,则方案相加。
优化:当g[i,j,k]=0时直接continue,因为(没有方案那还走什么啊~)
最后输出所有F[2^(n+1)-1,i,j]的最大值,方案数要除以2.

——2016.1.24 By Wzy

你可能感兴趣的:(Pascal语言)