哈哈发现这道题竟然没有题解,于是我决定写一份!

状压dp

题目:

懒惰的巫女Reimu因为各种原因在香霖堂的店主Rinnosuke那儿欠下了很多债,于是乎只好靠帮他在幻想乡中送货来偿还掉微不足道的一小部分。

懒归懒,Reimu还是很聪明的,她希望送货的总路程尽可能的短,同时任何一个地方不经过两次。

简而言之,便是在一张图上找一个边权和最小经过所有点恰好一次的封闭回路。

Input

多组输入数据。

第一行为一个N(N<=15),即图上总共有多少个点。

之后共N行以邻接矩阵格式输入边的数据。

保证i->j与j->i的距离相同。

Output

每组数据仅一行,输出最小的封闭回路或者是“NoAnswer”。

Sample Input

  1. 5
  2. 0 1 3 3 1
  3. 1 0 1 3 3
  4. 3 1 0 1 3
  5. 3 3 1 0 1
  6. 1 3 3 1 0

Sample Output

5

是一道很典型的旅行商问题

不同之处是,大白上的旅行商问题是一定会有答案的,而且是从0这个点开始,这道题可能会有no answer的情况并且不是从0开始

当某个图从任意点出发都无法回到起点时,就输出noanswer

因为用邻接矩阵输入,所以预处理将0设成INF表示无法连通

dp数组不能太大 20的时候就爆内存了

初始化ans为INF 跑了一圈还是INF的话说明没走通就是没结果

刚开始把每个点作为起点都判了一遍 某一个无法连通的样例不知道为啥输出了结果

后来赵木杉学长启发 发现因为是无向图 所以并不需要判断以每个点作为起点 只用判断从0开始就可以了

因为要是能形成一个圈 以哪个为起点都是可以的 要是不能 以哪个为起点都是不行的

代码如下

  1. #include <iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string>
  5. #include<cstring>
  6. #define INF 0x3f3f3f3f
  7. using namespace std;
  8. int n;
  9. long long edge[20][20],dp[1<<16][16];
  10. bool vis[20];
  11. long long rec(int s,int v,int now)
  12. {
  13. if(dp[s][v]>=0)
  14. return dp[s][v];
  15. if(s==(1<<n)-1&&v==now)
  16. return dp[s][v]=0;
  17. long long res=INF;
  18. for(int u=0;u<n;u++)
  19. {
  20. if(!(s>>u&1))
  21. {
  22. res=min(res,rec(s|1<<u,u,now)+edge[v][u]);
  23. }
  24. }
  25. return dp[s][v]=res;
  26. }
  27. int main()
  28. {
  29. while(scanf("%d",&n)!=EOF)
  30. {
  31. for(int i=0;i<n;i++)
  32. {
  33. for(int j=0;j<n;j++)
  34. {
  35. scanf("%lld",&edge[i][j]);
  36. if(edge[i][j]==0)
  37. edge[i][j]=INF;
  38. }
  39. }
  40. memset(dp,-1,sizeof(dp));
  41. int cnt=0;
  42. for(int i=0;i<n;i++)
  43. {
  44. if(edge[0][i]==1)
  45. cnt++;
  46. }
  47. long long ans=INF;
  48. ans=min(ans,rec(0,0,0));
  49. /*for(int i=0;i<n;i++)
  50. {
  51. ans=min(ans,rec(0,i,i));
  52. }
  53. */
  54. if(ans!=INF)
  55. printf("%lld\n",ans);
  56. else
  57. printf("NoAnswer\n");
  58. }
  59. return 0;
  60. }

提供一组noanswer的样例吧

4

0 1 0 0

1 0 2 4

0 2 0 3

0 4 3 0

CSU1129 送货到家 【状压dp】的更多相关文章

  1. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  2. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  3. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  4. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  5. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  6. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  7. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  8. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

  9. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

随机推荐

  1. 创建Maven创建src/main/java提示反复

    建立好一个Maven项目后.假设Java Resources资源文件下没有src/main/java目录,而且在手动创建这个文件时提示"已存在文件". 这说明,在这个项目配置中已经 ...

  2. 【Python 爬虫系列】从某网站下载小说《鬼吹灯》,正则解析html

    import re import urllib.request import urllib.parse import urllib.error as err import time # 下载 seed ...

  3. scala函数demo

    /** * Created by root * Description : 柯里化函数,偏应用函数,匿名函数,高阶函数 */ object FunctionTest { def main(args: ...

  4. 【RF库XML测试】Get Elements

    Name:Get ElementsSource:XML <test library>Arguments:[ source | xpath ]Returns a list of elemen ...

  5. Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance

    在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer instance启动的时间不可控,很有可能超出coordinator确定 ...

  6. linux clamav杀毒软件的安装

    一.概述 Linux比其它操作系统更稳定更安全.理论上Linux是有可能被病毒侵害的.但实际上 Linux机器几乎不可能遭受病毒的攻击.所以我这里的问题是为什么要为Linux准备防病毒软件,为了更好理 ...

  7. Java实现给定字符串的倒序输出

    1.除2判中法: public static String orderDesc(String str){ byte [] bytes = str.getBytes(); for ( int i = 0 ...

  8. Java并发编程--BlockingQueue

    概述 BlockingQueue支持两个附加操作的Queue:1)当Queue为空时,获取元素线程被阻塞直到Queue变为非空:2)当Queue满时,添加元素线程被阻塞直到Queue不满.Blocki ...

  9. Clock skewdetected. Your build may be incomplete.

    解决方法: find . -type f | xargs -n touch make clean make

  10. Android——简单对话框实现

    点击一个Button,弹出一个简单的对话框: bn3.setOnClickListener(new View.OnClickListener() { public void onClick(View ...