1097: [POI2007]旅游景点atr

Time Limit: 30 Sec  Memory Limit: 357 MB
Submit: 1531  Solved: 352
[Submit][Status][Discuss]

Description

  FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣
的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,
而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。由于
FGD非常讨厌乘车的颠簸,他希望在满足他的要求的情况下,旅行的距离尽量短,这样他就有足够的精力来欣赏风
景或者是泡MM了^_^.整个城市交通网络包含N个城市以及城市与城市之间的双向道路M条。城市自1至N依次编号,道
路亦然。没有从某个城市直接到它自己的道路,两个城市之间最多只有一条道路直接相连,但可以有多条连接两个
城市的路径。任意两条道路如果相遇,则相遇点也必然是这N个城市之一,在中途,由于修建了立交桥和下穿隧道
,道路是不会相交的。每条道路都有一个固定长度。在中途,FGD想要经过K(K<=N-2)个城市。成都编号为1,上海
编号为N,而FGD想要经过的N个城市编号依次为2,3,…,K+1.举例来说,假设交通网络如下图。FGD想要经过城市2,3,
4,5,并且在2停留的时候在3之前,而在4,5停留的时候在3之后。那么最短的旅行方案是1-2-4-3-4-5-8,总长度为1
9。注意FGD为了从城市2到城市4可以路过城市3,但不在城市3停留。这样就不违反FGD的要求了。并且由于FGD想要
走最短的路径,因此这个方案正是FGD需要的。

Input

  第一行包含3个整数N(2<=N<=20000),M(1<=M<=200000),K(0<=K<=20),意义如上所述。

Output

  只包含一行,包含一个整数,表示最短的旅行距离。

Sample Input

8 15 4
1 2 3
1 3 4
1 4 4
1 6 2
1 7 3
2 3 6
2 4 2
2 5 2
3 4 3
3 6 3
3 8 6
4 5 2
4 8 6
5 7 4
5 8 6
3
2 3
3 4
3 5

Sample Output

19

HINT

 上面对应于题目中给出的例子。

Source

Solution

SPFA预处理,状压DP

SPFA预处理出K+1个到各点的距离,状压DP,$dp[i][j]$表示当前状态为$i$(访问过的点的集合),现在在$j$点

转移很好转移..

PS:卡常数...我都以为我要T了...

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. using namespace std;
  8. int read()
  9. {
  10. int x=,f=; char ch=getchar();
  11. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  12. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
  13. return x*f;
  14. }
  15. #define maxn 20010
  16. #define maxm 400010
  17. int N,M,K,C,dis[maxn],d[][maxn],ans; bool visit[maxn];
  18. struct EdgeNode{int next,to,len,from;}edge[maxm];
  19. int head[maxn],cnt;
  20. void add(int u,int v,int w)
  21. {
  22. cnt++;
  23. edge[cnt].to=v;edge[cnt].from=u;edge[cnt].len=w;edge[cnt].next=head[u];head[u]=cnt;
  24. }
  25. void insert(int u,int v,int w) {add(u,v,w); add(v,u,w);}
  26.  
  27. #define inf 0x7fffffff
  28. void SPFA(int S)
  29. {
  30. queue<int>q; memset(visit,,sizeof(visit));
  31. for (int i=; i<=N; i++) dis[i]=inf;
  32. q.push(S); visit[S]=; dis[S]=;
  33. while (!q.empty())
  34. {
  35. int now=q.front(); q.pop(); visit[now]=;
  36. for (int i=head[now]; i; i=edge[i].next)
  37. if (dis[edge[i].to]>dis[now]+edge[i].len)
  38. {
  39. dis[edge[i].to]=dis[now]+edge[i].len;
  40. if (!visit[edge[i].to])
  41. q.push(edge[i].to),visit[edge[i].to]=;
  42. }
  43. }
  44. for (int i=; i<=N; i++) d[S][i]=dis[i];
  45. }
  46. int Min(int a,int b)
  47. {
  48. if (a==-) return b;
  49. if (a>b) return b; else return a;
  50. }
  51. int dp[<<][],zt[maxn];
  52. void DP()
  53. {
  54. for (int i=; i<=(<<K)-; i++)
  55. for (int j=; j<=K+; j++)
  56. if (dp[i][j]!=-)
  57. for (int k=; k<=K+; k++)
  58. if ((i&zt[k])==zt[k])
  59. dp[i|(<<(k-))][k]=Min(dp[i|(<<(k-))][k],dp[i][j]+d[j][k]);
  60. }
  61. int main()
  62. {
  63. N=read(),M=read(),K=read();
  64. for (int u,v,w,i=; i<=M; i++)
  65. u=read(),v=read(),w=read(),insert(u,v,w);
  66. for (int i=; i<=K+; i++) SPFA(i);
  67. C=read();
  68. for (int x,y,i=; i<=C; i++)
  69. x=read(),y=read(),zt[y]|=(<<(x-));
  70. memset(dp,-,sizeof(dp)); dp[][]=;
  71. DP(); ans=0x7fffffff;
  72. for (int i=; i<=K+; i++)
  73. if (dp[(<<K)-][i]!=-) ans=Min(dp[(<<K)-][i]+d[i][N],ans);
  74. printf("%d",ans);
  75. return ;
  76. }

开了两个DeBug,第一次忘删了OLE,删了一个还剩一个又WA了...然后卡时..

【BZOJ-1097】旅游景点atr SPFA + 状压DP的更多相关文章

  1. D. 旅游景点 Tourist Attractions 状压DP

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...

  2. HDU3247 Resource Archiver (AC自动机+spfa+状压DP)

    Great! Your new software is almost finished! The only thing left to do is archiving all your n resou ...

  3. bzoj [POI2007]旅游景点atr 状态压缩+Dij

    [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MBSubmit: 2258  Solved: 595[Submit][Status][D ...

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

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

  5. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

  6. BZOJ 3195 [Jxoi2012]奇怪的道路 | 状压DP

    传送门 BZOJ 3195 题解 这是一道画风正常的状压DP题. 可以想到,\(dp[i][j][k]\)表示到第\(i\)个点.已经连了\(j\)条边,当前\([i - K, i]\)区间内的点的度 ...

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

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

  8. BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

    水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ------------------- ...

  9. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

随机推荐

  1. javascript中的链表结构

    1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...

  2. Exploit利用学习1:MS09-001

    目标 IP: Kali系统IP: 1.使用Metasploit框架,在kali终端输入msfconsole打开Metasploit:如下图 2.搜索相关模块:search ms09-001 找到一个可 ...

  3. X200s,Debian 8(Jessie) 安装流水帐

    1. U盘启动安装 a. 因为无线网卡驱动是non-free,需要另外下载,对应X200s,文件是iwlwifi-5000-5.ucode,下完放到安装U盘的根目录下,安装时就不会再提示而是直接安装  ...

  4. PHP高效率写法及原因

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...

  5. 在Mac mini上安装 ESXi 5.5

    Mac mini 是 mid 2011 版本的, 安装原版ESXi 5.5 update 1 非常顺利, 没遇到任何问题. 提示: 1. 安装会初始化整个硬盘, 有数据要先备份 2. ESXi只使用有 ...

  6. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  7. Linux 网络编程详解六(多进程服务器僵尸进程解决方案)

    小结:在点对点p2p程序中,服务器端子程序退出,子进程会主动发送信号,关闭父进程,但是这种模式导致服务器只能支持一个客户端连接,本章节中使用新的框架,子进程退出,不主动发送信号关闭父进程,而是父进程安 ...

  8. eval的对于验证数学公式的用处

    var a=10,b=20; var s=a+b+((a/b)+(a+(a-b)))+(11)/a; var r=eval(s); console.log(r); 只要不报错,说明公式正确, 报错公式 ...

  9. C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8"的响应正文。...

    在调试一个WebApi程序时,出现下面错误: 通过分析怀疑是未添加序列化属性引起的,实体类改为下面结构后,问题依旧: 通过查阅资料和不断尝试,修改实体类的属性注解搞定:

  10. ContentProvider备份短信,以xml文件存储

    因为短信的内容已经通过ContentProvider暴露出来,所以我们可以直接用内容解析者获取短信内容. 想要获取短信内容,你需要知道的一些东西: 1.Uri uri = Uri.parse(&quo ...