hdu3001 Travelling
Travelling
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2520 Accepted Submission(s): 735
1 2 100
3 2
1 2 40
2 3 50
3 3
1 2 3
1 3 4
2 3 10
90
7
#include <iostream>
#include <stdio.h>
using namespace std;
int threenum[11]={1,3,9,27,81,243,729,2187,6561,19683,59049};
#define inf 0x4f4f4f4f
int dp[600000][15],n,m;
int threeevery[600000][15],dis[15][15];
int fmin(int x,int y){if(x<y)return x;return y;}
void makethree()//先预处理,算出所有的值
{
int i,temp,j;
for(i=0;i<threenum[10];i++)//3的11次
{
temp=i;
for(j=0;j<10;j++)
{
threeevery[i][j]=temp%3;
temp=temp/3;
}
} }
void init()
{
int i,j,s,e,val;
for(i=0;i<threenum[n];i++)
{
for(j=0;j<n;j++)
{
dp[i][j]=inf;
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
dis[i][j]=inf;
}
for(i=0;i<n;i++)
{
dp[threenum[i]][i]=0;//到自已的点初始化为0
} for(i=0;i<m;i++)
{ scanf("%d%d%d",&s,&e,&val);
s--;e--;//全部从0开
if(val<dis[s][e])
dis[s][e]=dis[e][s]=val;//排除重边取最小值 } }
int makedp()
{
int i,j,k,minx;
bool flag;
minx=inf;
for(i=0;i<threenum[n];i++)//对于每一位都要计算
{
flag=true;//标记是否每一个点都已经经过
for(j=0;j<n;j++)
{
if(threeevery[i][j]==0)//是这个点没有走
flag=false;
if(dp[i][j]==inf)//没有走过
{
continue;
}
for(k=0;k<n;k++)//加入k这个点
{
if((j==k)||threeevery[i][k]>=2||(dis[j][k]==inf))//自已到自已的地方,经过超过两次,不相连通去掉
continue;
dp[i+threenum[k]][k]=fmin(dp[i+threenum[k]][k],dp[i][j]+dis[j][k]);//从j到k
} }
if(flag)//满足条件,对最小值进行更新
{
for(j=0;j<n;j++)
{
minx=fmin(dp[i][j],minx);
}
}
}
if(minx==inf)
{
minx=-1;
} printf("%d\n",minx);
return 1;
}
int main()
{
makethree();
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
makedp();
}
return 0;
}
hdu3001 Travelling的更多相关文章
- hdu3001Travelling
参考了别人的代码 https://blog.csdn.net/u010372095/article/details/38474721 深感自己的弱小 这是tsp问题,和基本的tsp问题没什么大的区 ...
随机推荐
- LeetCode Single Number (找不不重复元素)
题意:给一个序列,序列中只有1个是单个的,其他都是成对出现的.也就是序列中有奇数个元素.要求找出这个元素. 思路:成对出现用异或最好了.两个同样的数一异或就变零,剩下的,就是那个落单的. class ...
- liux vim命令
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...
- Banner 广告设计技巧及经验(转自UI中国)
经常听到banner这个词,但是banner是什么意思呢?引用百度知道的解释:banner可以作为网站页面的横幅广告,也可以作为游行活动时用的旗帜,还可以是报纸杂志上的大标题.Banner主要体现中心 ...
- 通过js检测到iframe,使父窗口重定向到index -----------???----------------------
通过js检测到iframe,使父窗口重定向到index -----------???---------------------- 如果本身已将在iframe中,那么重定向的页面应该直接添加到父级ifr ...
- HDU 5881 Tea
Tea Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- java web 学习三(Tomcat 服务器学习和使用2)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- storm入门教程 第一章 前言[转]
1.1 实时流计算 互联网从诞生的第一时间起,对世界的最大的改变就是让信息能够实时交互,从而大大加速了各个环节的效率.正因为大家对信息实时响应.实时交互的需求,软件行业除了个人操作系统之外,数据库 ...
- Filezilla 多目录的访问设置
[转:http://hi.baidu.com/yangjie312/blog/item/125a8405423d896d03088171.html] 设置好主目录之后,点击“Add”按钮可以把其余的目 ...
- python 本地文档查看
本地安装Python文档本地查看,在命令行中运行: python -m pydoc -p 1234 在浏览器中访问如下链接,就可以访问到本地文档: http://localhost:1234/ 本地文 ...
- 基本输入输出系统BIOS---显示输出
显示器通过显示适配卡与系统相连, 显示适配卡是显示输出的接口卡,照相的显示器是CGA和EGA,目前的显示适配卡是VGA和TVGA,他们都支持两种显示方式,文本显示和图形显示 在BIOS中提供的显示I/ ...