#include<cstdio>
#include<cstring>
#define N 13
bool map[N+1][N+1];
int w[N],dp[1<<N][N+1][N+1],num[1<<N][N+1][N+1];
int Max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int t,n,m,mx,u,v,i,j,k,x,y,tt,mxw,mxn;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++) scanf("%d",&w[i]);
memset(map,false,sizeof(map));
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
map[u-1][v-1]=map[v-1][u-1]=true;
}
if(n==1){ printf("%d 1\n",w[0]);continue;}
memset(dp,-1,sizeof(dp));
for(mx=(1<<n),dp[0][n][n]=i=0,num[0][n][n]=1;i<mx;i++)
{
for(j=0;j<=n;j++)
{
for(k=0;k<=n;k++)
{
if(dp[i][j][k]>=0)
{
for(x=0;x<n;x++)
{
if(((1<<x)&i)==0&&(j==n||map[j][x]))
{
tt=dp[i][j][k]+w[x];
if(j<n) tt+=w[j]*w[x];
if(map[k][x]) tt+=w[k]*w[j]*w[x];
y=((1<<x)|i);
if(tt>dp[y][x][j]){ dp[y][x][j]=tt; num[y][x][j]=num[i][j][k];}
else if(tt==dp[y][x][j]) num[y][x][j]+=num[i][j][k];
}
}
}
}
}
}
for(mxw=-1,i=0;i<=n;i++) for(j=0;j<=n;j++) mxw=Max(mxw,dp[mx-1][i][j]);
if(mxw==-1) puts("0 0");
else
{
for(mxn=i=0;i<=n;i++) for(j=0;j<=n;j++) if(dp[mx-1][i][j]==mxw) mxn+=num[mx-1][i][j];
printf("%d %d\n",mxw,mxn/2);
}
}
return 0;
}
题目是POJ的2288。。
http://poj.org/problem?id=2288。。答案出错了。。不知为什么。。