传送门

题意:

一个无向图,从$1$到$n$,要求必须经过$2,3,...,k+1$,给出一些限制关系,要求在经过$v \le k+1$之前必须经过$u \le k+1$

求最短路


预处理出$1...k+1$到其他点的最短路

然后$f[i][s]$表示当前在$i$已经经过的点的集合为$s$的最短路

只考虑$1,2,...,k+1$就行了,

注意$1$也要考虑,一个点可能经过多次

然后实测dij比spfa快....我想试$pb\_ds$来着结果发现我的电脑上没有ext/pb_ds/priority_queue.hpp

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N=2e4+,M=2e5+,K=,S=(<<)+,INF=1e9;
  9. inline int read(){
  10. char c=getchar();int x=,f=;
  11. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  12. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  13. return x*f;
  14. }
  15. int n,m,k,u,v,w;
  16. int need[K],f[K][S];
  17. int d[K][N];
  18. struct Edge{
  19. int v,w,ne;
  20. }e[M<<];
  21. int cnt,h[N];
  22. inline void ins(int u,int v,int w){
  23. cnt++;
  24. e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
  25. cnt++;
  26. e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
  27. }
  28. int q[N],head,tail,inq[N];
  29. inline void lop(int &x){if(x==N) x=;else if(x==) x=N-;}
  30. void spfa(int s,int *d){
  31. head=tail=;
  32. d[s]=;inq[s]=;
  33. q[tail++]=s;
  34. while(head!=tail){
  35. int u=q[head++];inq[u]=;lop(head);
  36. for(int i=h[u];i;i=e[i].ne){
  37. int v=e[i].v;
  38. if(d[v]>d[u]+e[i].w){
  39. d[v]=d[u]+e[i].w;
  40. if(!inq[v]){
  41. inq[v]=;
  42. if(d[v]<d[q[head]]) head--,lop(head),q[head]=v;
  43. else q[tail++]=v,lop(tail);
  44. }
  45. }
  46. }
  47. }
  48. }
  49. int main(){
  50. freopen("in","r",stdin);
  51. n=read();m=read();k=read();
  52. for(int i=;i<=m;i++) u=read(),v=read(),w=read(),ins(u,v,w);
  53. memset(d,,sizeof(d));
  54. for(int i=;i<=k+;i++) spfa(i,d[i]);
  55. int c=read();
  56. while(c--) u=read()-,v=read(),need[v]|=(<<u);
  57.  
  58. memset(f,-,sizeof(f));
  59. int All=<<k;
  60. f[][]=;
  61. for(int s=;s<All;s++)
  62. for(int i=;i<=k+;i++) if(f[i][s]!=-){
  63. for(int j=;j<=k+;j++) if(j!=i && (need[j]&s)==need[j] ){
  64. int t=s|(<<(j-));
  65. if(f[j][t]>f[i][s]+d[i][j] || f[j][t]==-)
  66. f[j][t]=f[i][s]+d[i][j];
  67. }
  68. }
  69. int ans=INF;
  70. for(int i=;i<=k+;i++)
  71. if(f[i][All-]!=-) ans=min(ans,f[i][All-]+d[i][n]);
  72. printf("%d",ans);
  73. }
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. using namespace std;
  8. #define pii pair<int,int>
  9. #define MP make_pair
  10. #define fir first
  11. #define sec second
  12. typedef long long ll;
  13. const int N=2e4+,M=2e5+,K=,S=(<<)+,INF=1e9;
  14. inline int read(){
  15. char c=getchar();int x=,f=;
  16. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  17. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  18. return x*f;
  19. }
  20. int n,m,k,u,v,w;
  21. int need[K],f[K][S];
  22. int d[K][N];
  23. struct Edge{
  24. int v,w,ne;
  25. }e[M<<];
  26. int cnt,h[N];
  27. inline void ins(int u,int v,int w){
  28. cnt++;
  29. e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
  30. cnt++;
  31. e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
  32. }
  33.  
  34. priority_queue<pii,vector<pii>,greater<pii> > q;
  35. bool done[N];
  36. void dij(int s,int *d){
  37. for(int i=;i<=n;i++) d[i]=INF,done[i]=;
  38. d[s]=;
  39. q.push(MP(d[s],s));
  40. while(!q.empty()){
  41. int u=q.top().sec;q.pop();
  42. if(done[u]) continue;done[u]=;
  43. for(int i=h[u];i;i=e[i].ne)
  44. if(d[e[i].v]>d[u]+e[i].w){
  45. d[e[i].v]=d[u]+e[i].w;
  46. q.push(MP(d[e[i].v],e[i].v));
  47. }
  48. }
  49. }
  50. int main(){
  51. freopen("in","r",stdin);
  52. n=read();m=read();k=read();
  53. for(int i=;i<=m;i++) u=read(),v=read(),w=read(),ins(u,v,w);
  54. memset(d,,sizeof(d));
  55. for(int i=;i<=k+;i++) dij(i,d[i]);
  56. int c=read();
  57. while(c--) u=read()-,v=read(),need[v]|=(<<u);
  58.  
  59. memset(f,-,sizeof(f));
  60. int All=<<k;
  61. f[][]=;
  62. for(int s=;s<All;s++)
  63. for(int i=;i<=k+;i++) if(f[i][s]!=-){
  64. for(int j=;j<=k+;j++) if(j!=i && (need[j]&s)==need[j] ){
  65. int t=s|(<<(j-));
  66. if(f[j][t]>f[i][s]+d[i][j] || f[j][t]==-)
  67. f[j][t]=f[i][s]+d[i][j];
  68. }
  69. }
  70. int ans=INF;
  71. for(int i=;i<=k+;i++)
  72. if(f[i][All-]!=-) ans=min(ans,f[i][All-]+d[i][n]);
  73. printf("%d",ans);
  74. }

BZOJ 1097: [POI2007]旅游景点atr [DP 状压 最短路]的更多相关文章

  1. BZOJ 1097: [POI2007]旅游景点atr( 最短路 + 状压dp )

    先最短路预处理, 然后状压就行了 -------------------------------------------------------------------------- #include ...

  2. BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra

    题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不 ...

  3. bzoj 1097 [POI2007]旅游景点atr(最短路,状压DP)

    [题意] 给定一个n点m边的无向图,要求1开始n结束而且顺序经过k个点,给出经过关系x,y代表y必须在x之后经过,求最短路. [思路] 先对k个点进行spfa求出最短路. 设f[s][i]代表经过点集 ...

  4. 【BZOJ-1097】旅游景点atr SPFA + 状压DP

    1097: [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MBSubmit: 1531  Solved: 352[Submit][Sta ...

  5. 【BZOJ】1097: [POI2007]旅游景点atr(spfa+状压dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1097 首先还是我很sb....想到了分层图想不到怎么串起来,,,以为用拓扑序搞转移,,后来感到不行. ...

  6. BZOJ1097: [POI2007]旅游景点atr

    ..k次最短路后,考虑如何满足先走一些点 用状压dp,每一个点考虑它所需要经过的点a[i],当当前走过的点包含a[i]时,i 这个点才可以到达. 写的时候用记忆化搜索. #include<bit ...

  7. 【BZOJ1097】[POI2007]旅游景点atr 最短路+状压DP

    [BZOJ1097][POI2007]旅游景点atr Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺 ...

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

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

  9. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

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

随机推荐

  1. Spring框架学习笔记(9)——Spring对JDBC的支持

    一.使用JdbcTemplate和JdbcDaoSupport 1.配置并连接数据库 ①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql- ...

  2. [学习OpenCV攻略][007][缩小图片]

    cvPryDown(输入图片,输出图片) 根据输出图片的大小,把输入图片进行压缩 cvPryUp(输入图片,输出图片) 根据输出图片的大小,把输入图片进行放大 #include "cv.h& ...

  3. 织梦CMS提示DedeTag Engine Create File False错误的解决办法总结

    今天帮客户升级站点,遇到了一个老问题,生成栏目的时候提示"DedeTag Engine Create File False",突然发觉这个问题竟然在以前做站的时候困扰过我多次,于是 ...

  4. 怎样实现给DEDE的栏目增加栏目图片(1)

    http://www.genban.org/news/dedecms-7577.html 前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自 ...

  5. iphone开发笔记目录

    http://www.cnblogs.com/syxchina/archive/2012/10/20/2732731.html#2653802

  6. CPU频率

    CPU频率 CPU频率,就是CPU的时钟频率,简单说是CPU运算时的工作的频率(1秒内发生的同步脉冲数)的简称. 概念 CPU频率,就是CPU的时钟频率,简单说是CPU运算时的工作的频率(1秒内发生的 ...

  7. 在windows64位Anaconda3环境下安装XGBoost

    安装步骤参考的是: "Installing XGBoost For Anaconda on Windows":https://www.ibm.com/developerworks/ ...

  8. mysql中能够使用索引的典型场景

    mysql 演示数据库:http://downloads.mysql.com/docs/sakila-db.zip 匹配全值 explain select * from rental where re ...

  9. python正则表达式re模块详细介绍

    转自:http://www.jb51.net/article/50511.htm 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这 ...

  10. linux_samba服务安装

    什么是samba服务? 用于Windows和linux系统之间实现共享文件的目的服务 如何配置其服务? Linux端: 搭建服务 1. 安装samba yum install -y samba 2. ...