poj2288(状态压缩dp)
2016-07-06 15:02
387 查看
链接:点击打开链接
题意:给出n个点,m条边的无向图,给出每个点的点权,求点权和最小的哈密顿路径,相邻两个点要加上点权的乘积,形成环要加上环上的点权
代码:
题意:给出n个点,m条边的无向图,给出每个点的点权,求点权和最小的哈密顿路径,相邻两个点要加上点权的乘积,形成环要加上环上的点权
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; long long v[15],G[15][15]; long long dp[(1<<14)][15][15],path[(1<<14)][15][15]; int main(){ //dp[s][i][j]表示状态是s,最后两个点是i和j long long t,n,m,i,j,k,x,y,s,s_tmp,ans,sum,tmp; scanf("%I64d",&t); while(t--){ scanf("%I64d%I64d",&n,&m); for(i=0;i<n;i++) scanf("%I64d",&v[i]); memset(G,0,sizeof(G)); memset(dp,-1,sizeof(dp)); memset(path,0,sizeof(path)); for(i=0;i<m;i++){ scanf("%I64d%I64d",&x,&y); x--,y--; G[x][y]=G[y][x]=1; } if(n==1){ //一个点的时候要进行特判 printf("%d 1\n",v[0]); continue; } for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i!=j&&G[i][j]){ dp[(1<<i)+(1<<j)][i][j]=v[i]+v[j]+v[i]*v[j]; path[(1<<i)+(1<<j)][i][j]=1; } //先预处理出所有相邻的情况 } } for(s=0;s<(1<<n);s++){ for(i=0;i<n;i++){ if(s&(1<<i)) for(j=0;j<n;j++){ if((s&(1<<j))&&i!=j&&G[i][j]) for(k=0;k<n;k++){ //找出一个三个点都在的状态进行转移 if((s&(1<<k))&&i!=k&&j!=k&&G[j][k]){ s_tmp=s-(1<<i); if(dp[s_tmp][j][k]!=-1){ tmp=v[i]+v[i]*v[j]+dp[s_tmp][j][k]; if(G[i][k]) //判断是否成环 tmp+=(v[i]*v[j]*v[k]); if(tmp>dp[s][i][j]){ dp[s][i][j]=tmp; path[s][i][j]=path[s_tmp][j][k]; } else if(tmp==dp[s][i][j]) path[s][i][j]+=path[s_tmp][j][k]; } } } } } } ans=-1,sum=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i==j) continue; //遍历最后两个点判断最后的最大值 if(dp[(1<<n)-1][i][j]>ans){ ans=dp[(1<<n)-1][i][j]; sum=path[(1<<n)-1][i][j]; } else if(dp[(1<<n)-1][i][j]==ans) sum+=path[(1<<n)-1][i][j]; } } if(ans==-1) puts("0 0"); else printf("%I64d %I64d\n",ans,sum/2); } return 0; }
相关文章推荐
- 给jquery扩展一个获取url参数的函数(url传参不可带空格)
- 浅析highchart
- Windows驱动开发之文件操作
- Swift - 不借助第三方库转模型
- java集合概述
- 网络编程之HttpClient
- 进程
- 一致性哈希算法介绍
- centos 安装ffmpeg
- jdk环境变量的配置,Path路径的查看
- Hibernate整合Spring后,如何使用SchemaExport生成数据库表
- nginx 配置与运行
- boost获取时间戳
- 【华为OJ】字符串最后一个单词的长度
- 【华为OJ】字符串最后一个单词的长度
- Java对象的创建
- XNA 图形特效与文字显示
- LeetCode Palindrom Number
- 常用的本地存储方式
- FilenameFilter