hdu4281 状态压缩~MTSP最优值

hdu 4281 mtsp(多重旅行商问题) #include #include #include #include #define MAX(x,y) ((x)>(y)?(x):(y)) #define MIN(x,y) ((x)>(y)?(y):(x)) #define INF 0x3f3f3f3f using namespace std; int map[30][30]; int tot,dp[1<<17],dp1[20][1<<17], 阅读详情

一开始很简单的以为跟之前写的一样,多加个就可以了,第一问确实没问题,第二问就错的离谱了敲打,看了网上的解题思路,果断自己写了一个,代码写得比较搓委屈,不过时间复杂度还可以大笑。


ACcode:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

const int NS=15;
const int INF=1<<30;

struct Point
{
    int x,y,c;
} p[NS+1];

int top,flag,lim;
int u,v,t,w,n,m;
int state[1<<NS],tim[1<<NS][NS];
int p2[NS+2],bit[1<<NS][NS];
int dp[1<<NS],r[1<<NS],g[NS+1][NS+1];

int Dist(Point a,Point b)
{
    return ceil( sqrt( 1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y) ) );
}

void prepare()
{
    p2[0]=1;
    for (int i=1; i<NS; i++)
    p2[i]=p2[i-1]<<1;

    lim=1<<NS;
    for (int t,i=0; i<lim; i++)
    {
        t=0;
        for (int j=0; j<NS; j++)
        if (p2[j]&i) bit[i][++t]=j;
        bit[i][0]=t;
    }
}

int Min(int a,int b)
{
    return a<b?a:b;
}

int dp1()
{
    int u,v,w,t;
    for (int i=0; i<lim; i++)
    dp[i]=INF,r[i]=INF;
    dp[0]=1,r[0]=0;
    for (int i=1; i<lim; i++)
    for (int j=1; j<=bit[i][0]; j++)
    {
            u=bit[i][j],v=i-p2[u],w=r[v]+p[u].c;
            if (w<=m)
            {
                if (dp[i]>dp[v])
                dp[i]=dp[v],r[i]=w;
                else if (dp[i]==dp[v])
                r[i]=Min(w,r[i]);
            }
            if (p[u].c<=m)
            {
                if (dp[i]>(dp[v]+1.0))
                dp[i]=dp[v]+1,r[i]=p[u].c;
                else if (dp[i]==dp[v]+1)
                r[i]=Min(p[u].c,r[i]);
            }
    }
    return dp[lim-1]>=INF?-1.0:dp[lim-1];
}

void init()
{
    top=0;
    memset(state,0,sizeof(state));
    for (int s,t,i=0;i<lim;i++)
    {
        s=0;
        for (int j=1;j<=bit[i][0];j++)
        t=bit[i][j],s+=p[t].c;
        if (s<=m) state[i]=1;
    }
}

int dp2()
{
    init();
    for (int i=0;i<lim;i++)
    for (int j=0;j<n;j++)
    tim[i][j]=INF;
    for (int i=0;i<lim;i++)
    dp[i]=INF;
    dp[0]=0;
    for (int i=0;i<n;i++)
    if (p[i].c<=m)
    tim[p2[i]][i]=g[n][i];

    for (int i=0;i<lim;i++)
    if (state[i])
    for (int j=1;j<=bit[i][0];j++)
    {
        u=bit[i][j],v=i-p2[u];
        for (int k=1;k<=bit[v][0];k++)
        t=bit[v][k],
        tim[i][u]=Min(tim[i][u],tim[v][t]+g[t][u]);
        dp[i]=Min(dp[i],tim[i][u]+g[u][n]);
    }
    for (int i=1;i<lim;i++)
    {
        for (int j=n;j>=0;j--)
        if (p2[j]&i){ t=p2[j];break; }
        for (int j=i;j!=t;j=i&(j-1))
        dp[i]=Min(dp[i],dp[j]+dp[i^j]);
        dp[i]=Min(dp[i],dp[t]+dp[i^t]);
    }
    return dp[lim-1]>=INF?-1:dp[lim-1];
}

int main()
{
    prepare();
    while (~scanf("%d %d",&n,&m))
    {
        n--,flag=0,lim=1<<n;

        scanf("%d%d",&p[n].x,&p[n].y);
        for (int i=0; i<n; i++)
        scanf("%d%d",&p[i].x,&p[i].y);
        scanf("%d",&p[n].c);
        for (int i=0; i<n; i++)
        scanf("%d",&p[i].c),
        flag+= p[i].c>m?1:0;

        if (flag)
        {
            printf("-1 -1\n");
            continue;
        }
        for (int i=0; i<=n; i++)
        for (int j=i+1; j<=n; j++)
        g[i][j]=g[j][i]= i==j?0:Dist(p[i],p[j]);

        printf("%d %d\n",dp1(),dp2());
    }
    return 0;
}


MTSP遗传算法 遗传算法求解多旅行商求解最短路径问题,实现最短路径选择 立即下载

相关推荐

ESP-01S使用micropython,利用Thonny烧写固件

在家舒服的太久了,想学习点新的东西,这次看上了ESP8266系列的联网设备,想自己做点小玩意出来耍耍,下面跟我一起来学习吧。本篇主要记录固件的烧写及测试。Thonny下载链接不算难,但是网上资源较少。也是提醒自己不要忘记这个步骤,记录一下,也分享给和我一样开始接触的小伙伴,加油加油,万事开头难。

weixin_43422072的博客 1693

解决多旅行商(MTSP)的分组遗传算法(GGA-SS)

摘要: 多旅行推销员问题(MTSP)是著名旅行推销员问题(TSP)的扩展。假设有m>1名销售人员和n>m个城市要访问,MTSP寻求将城市划分为m个组,并在每个组中的城市之间排序,以便每组城市由一名销售人员按指定顺序访问,这样每个城市只访问一次,所有销售人员的总行程之和最小化。除了最小化所有销售人员的总行程外,我们还考虑了另一个目标,即最小化任何一个销售人员的最大行程,这与平衡销售人员之间的工作量有关。在本文中,我们提出了一种新的基于分组遗传算法的MTSP方法,并将我们的结果与文献中的其他方法进

qq_45874683的博客 7681

数字后端流程--place

Floorplan完成后芯片的大致框架已经出现,万里长征已经迈出特别重要的第一步了,前面的步骤我们已经完成了io port,macro的摆放,现在core外只剩下std cell(标准单元)了,Place这一步就是要把std cell放进core里。看到密密麻麻的std cell也不用紧张,因为放std cell不用像macro手动一个一个摆,工具就可以帮我们完成大部分工作。虽然这一步的工作只有一个,但也不是只要Place完就能进行下一步的,衡量Place质量是否满足标准会通过以下几点判断。

qq_68400574的博客 772

HDU4281:Judges' response(mTSP问题)

Problem Description   The contest is running and the judges is busy watching the progress of the contest. Suddenly, N - 1 (N <= 16) contestants hand up their hand at the same time. The judges shoul

ACM!荣耀之路! 2510

算法面经手撕系列(2)--手撕BatchNormlization

手动实现/手撕BatchNormlization

罟霖同学的站点 868

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1242

HDU - 4281 Judges' response(MTSP)

题目大意:有n个点,第一个点是裁判的位置,其他的点是参赛者的位置。现在每个参赛者都要求裁判来答疑,裁判需要花Ci分钟对第i组进行答疑。已知每个裁判最多答疑M分钟,如何分配,才能使答疑的裁判的人数达到最少,如果可以分配的话,请求出裁判需要走的距离和的最小值解题思路:状态压缩,然后预处理一下一个裁判的能答疑的组别 要判断需要多少个裁判的话,可以用背包+状压来解决 设dp[i]表示答疑i状态的组别需要

静静地码 609

从0到1构建数据分析AI Agent:数据采集、洞察生成与报告自动化

在企业数字化转型的今天,数据分析师80%的时间被消耗在重复取数、数据清洗、报表排版等低价值劳动上,真正用于深度业务洞察和决策支持的时间不足20%。本文将从核心概念、技术原理、代码实现、落地实践全维度,教你从0到1搭建一套完整的数据分析AI Agent系统,实现「用户用自然语言提需求→Agent自动采集多源数据→AI自动挖掘业务洞察→自动生成符合业务要求的多格式报告」的全链路自动化,平均可将需求响应速度从天级压缩到分钟级,释放70%以上的分析师人力成本。

AI Python 编程之道的博客 472

HDU 4281(01 背包+ 多旅行商问题)

HDU 4281 Judges' response Problem Description   The contest is running and the judges is busy watching the progress of the contest. Suddenly, N - 1 (N <= 16) contestants hand up their ...

aitang6631的博客 240

R语言使用survminer包的ggcompetingrisks函数可视化竞争风险的累积事件曲线、使用可视化对象的mapping属性自定义修改、配置颜色分组及线条类型

R语言使用survminer包的ggcompetingrisks函数可视化竞争风险的累积事件曲线、使用可视化对象的mapping属性自定义修改、配置颜色分组及线条类型

data+scenario+science+insight 1380

SAP-ABAP:SAP系统调优利器:RZ11动态参数修改全指南

SAP系统调优利器:RZ11动态参数修改全指南

baidu_35680696的博客 970

HDU 4281 (状态压缩+背包+MTSP)

Judges' response Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 741Accepted Submission(s): 429 Problem Description   The contest is runn...

weixin_33695082的博客 190

Mac版 Android Studio自带模拟器无法联网解决方案

前言 作为一枚安卓开发者,免不了使用模拟器来开发调试(毕竟它比手机方便太多)。但是因为适配需要,我们会更多的使用真机开发调试,那么当模拟器遇到这样那样的问题,我们往往会无从下手,其中最烦的就是网络问题。 我最近图方便,又重新用起了模拟器,但是发现联网失败,用模拟器内置的浏览器也打不开网页,于是百度上一通找,毫无效果,各种说用cmd命令行设置模拟器dns的都没用,显示没有什么dns文件啥的,后来...

陈万洲的专栏 1万+

HDU4281

问题链接:HDU4821 String。 字符串有关的算法,大致可以分为三类。一是像本题一样,用哈希函数来解(定长字符串);二是KMP算法(包括其变种);三是AC自动机。 这个问题,由于子串之间需要相互比较的组合太多,为了避免重复的比较计算,需要找到一个有效的办法进行处理。不然就组合爆炸了。所以,字符串的哈希函数是一个好的选择。各个子串都计算一个哈希值,字符串比较问题就变成了哈希值

MyHeaven7的博客 578

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

hdu-4281

//一个mtsp模型题,以前只弄过tsp,第一次弄mtsp,大牛的解题报告让我受益匪浅,mtsp问题主要就是对一个mtsp分解成多个单tsp组合,并使组合后取得的值是一个最值;   //代码如下:   #include #include #include #define inf 10000000 struct node { int pre,sum,id; }list[200

Lazier’s blog 728

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU4281 Judges' response(状态压缩+01背包+分组背包)经典

Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 565    Accepted Submission(s): 308 Problem Description   The contest i

青山绿水之辈 专栏 1433

【hdu4281状态压缩+01背包+多旅行商问题】

题意:有n道题,每道题在二维平面内的不同位置且给出每道题的坐标,同时给出处理每道题所需的时间p,现在已知裁判的耐心有限,之会花费m个单位时间去做事,做完后回到起始点。 现在的要求是,我要多少个裁判才能对每个问题都处理完,并且同一道题不能有两个裁判进行处理,并求出总路径最小的值。 总复杂度O(2^(2*n)+(2^n*n^2)) #include &lt;bits/stdc++.h&gt; #i...

sxy201658506207的博客 529

hdu 4281(MTSP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4281 题意:给出N个点,第一个点是裁判,其他N-1个点需要裁判过去回答问题,每个点需要的时间不一样,而每个裁判最多能回答M分钟的问题。题目分两问,第一问是如何分配可以使使用的裁判数最少,第二问是如何分配裁判,使裁判走过的总路程和最少,裁判一开始都在1,最终也要回到1。 思路:首先我们可以把符合条件...

weixin_33834628的博客 228

HDU 4281 Judges' response(12年天津 MTSP问题)

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove  题目:给出N个人,其中0号是裁判的位置,剩下有N-1的人提问,裁判需要去回答问题,每个人有一个val,每个裁判能拿到的val的上限为K。问题最少需要几个裁判,以及最少时间 http://acm.hdu.edu.cn/show

窝不是爱酱,喵~~~~ 3469

hdu 4281

地址:http://acm.hdu.edu.cn/showproblem.php?pid=4281 题意:有n个任务等待完成,每个任务有位置,所需时间,每个人最多m分钟。    第一问是求这些任务最少几个人完成;第二问是给无数个人,问最少需要多少分钟完成所有任务,并且每个人上限还是m。 mark:第一问可以状态dp,可以01背包记录一下,然后回溯。     第二问参见了大牛的做法,先状态d...

weixin_30518397的博客 143

遗传算法求解mtsp问题的缺点分析_遗传算法的优缺点

遗传算法属于进化算法(EvolutionaryAlgorithms)的一种,它通过模仿自然界的选择与遗传的机理来寻找最优解.遗传算法有三个基本算子:选择、交叉和变异.。数值方法求解这一问题的主要手段是迭代运算。一般的迭代方法容易陷入局部极小的陷阱而出现"死循环"现象,使迭代无法进行。遗传算法很好地克服了这个缺点,是一种全局优化算法。生物在漫长的进化过程中,从低等生物一直发展到高等生物,可以说是...

weixin_39589557的博客 681

HDU4281——状态压缩+01+TSP——Judges' response

Description   The contest is running and the judges is busy watching the progress of the contest. Suddenly, N - 1 (N <= 16) contestants hand up their hand at the same time. The judges sho...

dgjm4087的博客 185

hdu4281 状态压缩dp(mtsp)+树状数组

#include&lt;bits/stdc++.h&gt; #define inf 0x3f3f3f3f using namespace std; const int maxn=17; /*这里参考大佬的代码,去掉初始位进行二进制枚举*/ int n,m,maxs,lim,cnt; int x[maxn],y[maxn],c[maxn]; int dp[1&lt;&lt;maxn];///某状态...

RockyHOO1209的博客 459

hdu 4640 Island and study-sister(最短路+状压dp)

题目链接:hdu 4640 Island and study-sister解题思路用二进制数表示2~n的点是否移动过的状态,dp[s][i]dp[s][i]表示状态s上的点必须经过并且当前在i节点的最小代价, 这步用类似最短路的方式求出。 然后是dp2[i][s]dp2[i][s]表示i个人移动过s状态的点的最小代价。代码#include <cstdio> #include <cstring> #

不慌不忙、不急不躁 986

hdu 4281 Judges' response 状压DP+TSP ★★★★

Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 678    Accepted Submission(s): 389 Problem Description   The conte

便纵有千种风情 762

找啊找啊找GF~背包拓展

出处:RQNOJ 57   开始时没有考虑MM最大值,果断Wrong,后面一分析,发现状态转移方程不对,立马改了过来,增加了一个计算数量的数组,最后输出再加个判断就AC了。网上有些优化的代码看不懂就没去理了,有兴趣的可以去研究一下。   #include #include #define min(a,b) a<b?(a):(b) #define max(a,b) a>b?(a):(b

丿Smilē 丶晨星灬 1539
上一篇: hdu4570 区间DP
下一篇: hdu2167 状态压缩~最优值
丿Smile灬晨星
博客等级 码龄14年 46粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值