poj 3311 floyd + 状态
2015-12-01 23:09
344 查看
题目链接:http://poj.org/problem?id=3311
先Floyd处理了,变成tsp问题
if(k == 0)
tem = 0;
else tem = (1<<(k-1));//因为点是从1开始的,懒得预处理dp[0][i]
dp[i+tem][k] = min(dp[i+tem][k],dp[i][j]+map[j][k]);//由这次状态写出下次的
先Floyd处理了,变成tsp问题
if(k == 0)
tem = 0;
else tem = (1<<(k-1));//因为点是从1开始的,懒得预处理dp[0][i]
dp[i+tem][k] = min(dp[i+tem][k],dp[i][j]+map[j][k]);//由这次状态写出下次的
#include <stdio.h> #include <string.h> #define inf 0x7f7f7f7f int n; int map[11][11]; int dp[1<<12][12]; int min(int a,int b) { if(a > b) return b; return a; } int main() { int i,j,k; int n,tem,tmp; while(~scanf("%d",&n),n)//因为没加n=0,wa七次,哭晕在厕所 { memset(dp,inf,sizeof(dp)); for(i = 0; i <= n; i++) { for(j = 0; j <= n; j++) { scanf("%d",&map[i][j]); } } for(k = 0; k <= n; k++) { for(i = 0; i <= n; i++) { for(j = 0; j <= n; j++) { map[i][j] = min(map[i][j],map[i][k]+map[k][j]); } } } dp[0][0] = 0; tmp = 1<<n; for(i = 0; i < tmp; i++) { for(j = 0; j <= n; j++) { if(dp[i][j] < inf) { for(k = 0; k <= n; k++) { if(k == 0) tem = 0; else tem = (1<<(k-1)); if(!(i&tem)) { dp[i+tem][k] = min(dp[i+tem][k],dp[i][j]+map[j][k]);//状态为i,经过j的城市,走上j通往k的不归路 } } } } } tmp--; tem = inf; for(i = 1; i <= n; i++) { tem = min(tem,dp[tmp][i]+map[i][0]);//<span style="font-family: Arial, Helvetica, sans-serif;">dp[tmp][i]是已经全部到过,但是终点为i,map[i][0]是快速从I返回到店的捷径</span> } printf("%d\n",tem); } return 0; }
相关文章推荐
- 小试Unity中OBJ和Scene打包Bundle与加载--wondows平台下
- Jquery为DIV添加点击事件,Jquery为a标签超链接添加点击事件
- ReentrantLock的使用和Condition
- 关于cssReset所需掌握的知识点(一)
- Linux下配置文件读取操作流程及其C代码实现
- 10013---ASM字节码框架
- 大批量、大体积excel文件转版为印刷版pdf:对excel文件格式要求及参数设置(2015/12/03)
- 机器码 与 汇编指令的关系
- Quartz2D初体验(二)
- Java查看动态代理生成的代码
- servlet自动刷新页面(比赛文字直播)
- Netty系列之Netty高性能之道
- 我为什么从程序员转行做了产品经理
- 方正综合网络安全打印系亮相“2015网络与信息安全博览会
- 我的VPS选择之路
- 111、Minimum Depth of Binary Tree
- TensorFlow的代码框架
- Module Zero概览
- 岛屿的个数number-of-islands
- 如何在Windows 10桌面显示我的电脑和控制面板等系统图标