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问题没什么大的区 ...
随机推荐
- uvalive 3523 Knights of the Round Table 圆桌骑士(强连通+二分图)
题目真心分析不出来.看了白书才明白,不过有点绕脑. 容易想到,把题目给的不相邻的关系,利用矩阵,反过来建图.既然是全部可行的关系,那么就应该能画出含奇数个点的环.求环即是求双连通分量:找出所有的双连通 ...
- UVA 568 Just the Facts (水)
题意: 求一个数n的阶乘,其往后数第1个不是0的数字是多少. 思路: [1,n]逐个乘,出现后缀0就过滤掉,比如12300就变成123,继续算下去.为解决爆long long问题,将其余一个数mod, ...
- 利用改进的cca算法,进行识别
这个方法,很有意思,第一,不用降维:第二,跟ica做比较,竟然说比强大的ica还好: 看来,国防科大的博士,还是很牛的. <OI and fMRI Signal Separation Using ...
- JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结 【转】http://blog.csdn.net/uniqer/article/details/7789104
1.兼容firefox的 outerHTML,FF中没有outerHtml的方法. 代码如下: if (window.HTMLElement) { HTMLElement.prototype.__de ...
- Ejabberd源码解析前奏--管理
一.ejabberdctl 使用ejabberdctl命令行管理脚本,你可以执行ejabberdctl命令和一些普通的ejabberd命令(后面会详细解说).这意味着你可以在一个本地或远程ejabbe ...
- android学习笔记六
Android中Activity的Intent大全 Api Level 3: (SDK 1.5) android.intent.action.ALL_APPS android.intent.actio ...
- mysql教程-触发器
触发器 1. mysql触发器 情景说明 情景设置,如图,当我们点击了购买,将会发生什么? 现有如下两张表 商品表 编号(id)名称(name)价格(price)库存(stock) 1F2战斗机100 ...
- C#中常见的winform控件命名规范
我们知道Button 常常简称为btn,那么Winform中的其它控件呢,这篇文章在C#的winform控件命名规范 的基础上对一些控件的名称的简称进行了整理. 1. 标准控件 NO. 控件类型简写 ...
- [Papers]NSE, $\pi$, Lorentz space [Suzuki, NA, 2012]
$$\bex \sen{\pi}_{L^{s,\infty}(0,T;L^{q,\infty}(\bbR^3))} \leq \ve_*, \eex$$ with $$\bex \frac{2}{s} ...
- Redis Sentinel机制与用法
概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...