首页 > 代码库 > poj2288汉密尔顿路
poj2288汉密尔顿路
抄书
#include<stdio.h>#include<iostream>#include<string.h>#define maxn 13#define maxstatus 1<<13using namespace std;typedef long long LL ;LL dp[maxstatus][maxn][maxn];LL ways[maxstatus][maxn][maxn];int value[maxn];bool link[maxn][maxn];int nislands;LL maxvalue;LL maxways;void init(){ int nbridges; int i;int row;int col; scanf("%d%d",&nislands,&nbridges); for(int i=0;i<nislands;i++){ scanf("%d",value+i); } if(nislands==1) return ; memset(dp,-1,sizeof(dp)); memset(ways,0,sizeof(ways)); memset(link,0,sizeof(link)); for(int i=0;i<nbridges;i++){ scanf("%d%d",&row,&col); row--;col--; link[row][col]=1;link[col][row]=1; dp[(1<<row)|(1<<col)][row][col]=dp[(1<<col)|(1<<row)][col][row]=value[col]+value[row]+value[col]*value[row]; ways[(1<<row)|(1<<col)][row][col]=ways[(1<<row)|(1<<col)][col][row]=1; }}void Dp(){ int s;int i;int j;int k; LL temp; LL nextstatus; if(nislands==1) { maxvalue=value[0];maxways=1; return ; } for(s=0;s<(1<<nislands);s++){ for(i=0;i<nislands;i++){ if(s&(1<<i)){ for(j=0;j<nislands;j++){ if(i!=j&&(s&(1<<j))&&dp[s][i][j]>-1){ for(k=0;k<nislands;k++){ if(!(s&(1<<k))&&link[i][k]==1){ nextstatus=s|(1<<k); temp=dp[s][i][j]+value[k]+value[k]*value[i]; if(link[j][k]==1) temp+=value[k]*value[j]*value[i]; if(dp[nextstatus][k][i]==temp){ ways[nextstatus][k][i]+=ways[s][i][j]; } else if(dp[nextstatus][k][i]<temp){ ways[nextstatus][k][i]=ways[s][i][j]; dp[nextstatus][k][i]=temp; } } } } } } } } maxvalue=-1;maxways=0; s=(1<<nislands)-1; for(int i=0;i<nislands;i++){ for(int j=0;j<nislands;j++){ if(!link[i][j]) continue; if(dp[s][i][j]==maxvalue) maxways+=ways[s][i][j]; else if(dp[s][i][j]>maxvalue){ maxvalue=dp[s][i][j]; maxways=ways[s][i][j]; } } } maxways=maxways/2;}int main(){ int i;int cases; scanf("%d",&cases); for(int i=0;i<cases;i++){ init(); Dp(); if(maxvalue=http://www.mamicode.com/=-1) printf("0 0\n"); else cout<<maxvalue<<maxways<<endl; } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。