分析:

我们可以考虑,因为我们必须经过这些节点,那么我们可以将它状压,并且我们因为可以重复走,只是要求停顿前后,不要求遍历前后,那么我们之间存一下点与点之间的最短路,之后每次转移一下就可以了。

f[i][S]表示在i节点,状态为S,转移:f[i][S]=max{f[j][S^(1<<i-1)]+dis[i][j]};前后的话,判断一下就可以了,P.S.BZOJ卡时限,**洛谷卡空间

附上代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
#define N 20005
#define M 1<<20
struct node
{
int to,next,val;
}e[N*20];
int head[N],cnt,f[(M)+10][21],map[21][21],dis[N],vis[N],g[N],cur[21],n,m,k;
priority_queue <pair<int ,int > >q;
void add(int x,int y,int z)
{
e[cnt].to=y;
e[cnt].next=head[x];
e[cnt].val=z;
head[x]=cnt++;
}
void Dijkstra(int S)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();
q.push(make_pair(0,S));dis[S]=0;
int num=0;
while(!q.empty())
{
if(num==n)break;
int x=q.top().second;q.pop();
if(vis[x])continue;
vis[x]=1;
num++;
for(int i=head[x];i!=-1;i=e[i].next)
{
int to1=e[i].to;
if(dis[to1]>dis[x]+e[i].val)
{
dis[to1]=dis[x]+e[i].val;
q.push(make_pair(-dis[to1],to1));
}
}
}
for(int i=1;i<=k;i++)map[S-1][i]=dis[i+1];
if(!cur[S-1])f[1<<(S-2)][S-1]=dis[1];
g[S-1]=dis[n];
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
if(!k)
{
Dijkstra(1);
printf("%d\n",dis[n]);
return 0;
}
int Q;
scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
cur[y-1]|=(1<<(x-2));
}
memset(f,0x3f,sizeof(f));
for(int i=2;i<=k+1;i++)Dijkstra(i);
for(int S=1;S<1<<k;S++)
{
for(int i=1;i<=k;i++)
{
if(S&(1<<(i-1)))
{
for(int j=1;j<=k;j++)
{
if(!(S&(1<<(j-1)))&&(S&cur[j])==cur[j])
{
f[S|(1<<(j-1))][j]=min(f[S|(1<<(j-1))][j],f[S][i]+map[i][j]);
}
}
}
}
}
int ans=1<<30;
for(int i=1;i<=k;i++)
{
ans=min(ans,f[(1<<k)-1][i]+g[i]);
}
printf("%d\n",ans);
return 0;
}

  

[POI2007]旅游景点atr BZOJ1097的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 2018.11.06 bzoj1097: [POI2007]旅游景点atr(最短路+状压dp)

    传送门 预处理出不能在每个点停留之后才停留的点的状态. 对kkk个点都跑一次最短路存下来之后只需要简单状压一下就能过了吐槽原题空间64MB蒟蒻无能为力 然后用fillfillfill赋极大值的时候当m ...

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

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

  8. [POI2007]旅游景点atr

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

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

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

随机推荐

  1. Intellij Idea出现 unable to establish loopback connection

    项目一运行就出现这个情况,好几次了,最后发现只要防火墙关闭,项目就可以运行成功.错误提示:“C:\Program Files\Java\jdk1.8.020\bin\java” -Xmx700m -D ...

  2. Nginx部署入门

    一.什么是Nginx? Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/POP3 ...

  3. es6 export与export default 的区别

    相同点: 均可用于导出常量.函数.文件.模块等 不同点: 1.在一个文件中export可以有多个,但export default 只能有一个: export var firstName = 'Mich ...

  4. php 去除所有空格 包括中文空格圆角空格

    有的中文的半角,圆角空格或者段落符显示为空白的.可以用正则来处理 preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/","" ...

  5. 使用ArcGIS Runtime 100 进行本地GIS数据处理的注意事项

    如下图所示,如果需要使用ArcGIS Runtime 100 进行本地GIS数据处理,则需要依赖Local Server通过发布GP服务实现. 一.ArcGIS Runtime所使用的GPK是有版本限 ...

  6. android开发之braodCast

    广播问题: 遇到了broadcast中sendBroadcast之后,注册registerReceiver的receiver接受不到广播,原因是permisson权限问题. 自定义的permissio ...

  7. Android 优秀开源项目

    以下是本人日常工作中收集的比较不错的Android开源项目 roottools: RootTools gives Rooted developers easy access to common roo ...

  8. 创建一个OpenGL窗口

    在上节课Windows10+VS2017 用GLFW+GLAD 搭建OpenGL开发环境 中,我们搭建好了OpenGL开发环境.这节课编写代码去测试开发环境. 还是用上节课创建的OpenGL项目,右击 ...

  9. Linux —— Vi 命令介绍

    简介 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器. 这里只是简单地介绍一下它的用法和一小部分指令. 由于对Unix及Linux系统的任何版本,vi编辑 ...

  10. C# 获得目录下所有文件或指定文件类型文件(包含所有子文件夹)

    public partial class FileGet { /// <summary> /// 私有变量 /// </summary> private static List ...