| Time Limit: 4000MS | Memory Limit: 65536K | |
Description
Input
Output
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
/*
ID: j.sure.1
PROG:
LANG: C++
*/
/****************************************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <climits>
#include <iostream>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
/****************************************/
int n, m;
const int N = 13;
bool G[N][N];
int w[N];
int dp[1<<N][N][N];
LL ways[1<<N][N][N];
void init()
{
memset(G, 0, sizeof(G));
memset(dp, -1, sizeof(dp));
memset(ways, 0, sizeof(ways));
}
void DP()
{
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) if(G[i][j]) {
dp[(1<<i)|(1<<j)][i][j] = w[i] + w[j] + w[i]*w[j];
ways[(1<<i)|(1<<j)][i][j] = 1;
}
}
for(int p = 0; p < (1<<n); p++) {
for(int i = 0; i < n; i++) if(p & (1<<i)) {
for(int j = 0; j < n; j++) if(p & (1<<j)) {
if(G[i][j] && dp[p][i][j] != -1) {
for(int k = 0; k < n; k++) {
if(G[j][k] && k != i && !(p & (1<<k))) {
int tmp = dp[p][i][j] + w[k] + w[k] * w[j];
if(G[i][k]) {
tmp += w[i] * w[j] * w[k];
}//形成三角形
if(dp[p|(1<<k)][j][k] < tmp) {
dp[p|(1<<k)][j][k] = tmp;
ways[p|(1<<k)][j][k] = ways[p][i][j];
}//决定是否更改原方案
else if(dp[p|(1<<k)][j][k] == tmp) {
ways[p|(1<<k)][j][k] += ways[p][i][j];
}
}
}
}
}
}
}
}
int main()
{
#ifdef J_Sure
// freopen("000.in", "r", stdin);
// freopen(".out", "w", stdout);
#endif
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
init();
for(int i = 0; i < n; i++) {
scanf("%d", &w[i]);
}
if(n == 1) {
printf("%d 1\n", w[0]);
continue ;
}
int u, v;
for(int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
u--; v--;
G[v][u] = G[u][v] = true;
}
DP();
int maxi = 0;
LL ans = 0;
int P = (1<<n) - 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) if(G[i][j]) {
if(maxi < dp[P][i][j]) {
maxi = dp[P][i][j];
ans = ways[P][i][j];
}
else if(maxi == dp[P][i][j]) {
ans += ways[P][i][j];
}
}
}
printf("%d %lld\n", maxi, ans / 2);
}
return 0;
}
【汉密尔顿、DP|状态压缩】POJ-2288 Islands and Bridges
原文地址:http://blog.csdn.net/j_sure/article/details/43459211