【BZOJ-1097】旅游景点atr SPFA + 状压DP
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
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
HINT
上面对应于题目中给出的例子。
Source
Solution
SPFA预处理,状压DP
SPFA预处理出K+1个到各点的距离,状压DP,$dp[i][j]$表示当前状态为$i$(访问过的点的集合),现在在$j$点
转移很好转移..
PS:卡常数...我都以为我要T了...
Code
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- using namespace std;
- int read()
- {
- int x=,f=; char ch=getchar();
- while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
- while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
- return x*f;
- }
- #define maxn 20010
- #define maxm 400010
- int N,M,K,C,dis[maxn],d[][maxn],ans; bool visit[maxn];
- struct EdgeNode{int next,to,len,from;}edge[maxm];
- int head[maxn],cnt;
- void add(int u,int v,int w)
- {
- cnt++;
- edge[cnt].to=v;edge[cnt].from=u;edge[cnt].len=w;edge[cnt].next=head[u];head[u]=cnt;
- }
- void insert(int u,int v,int w) {add(u,v,w); add(v,u,w);}
- #define inf 0x7fffffff
- void SPFA(int S)
- {
- queue<int>q; memset(visit,,sizeof(visit));
- for (int i=; i<=N; i++) dis[i]=inf;
- q.push(S); visit[S]=; dis[S]=;
- while (!q.empty())
- {
- int now=q.front(); q.pop(); visit[now]=;
- for (int i=head[now]; i; i=edge[i].next)
- if (dis[edge[i].to]>dis[now]+edge[i].len)
- {
- dis[edge[i].to]=dis[now]+edge[i].len;
- if (!visit[edge[i].to])
- q.push(edge[i].to),visit[edge[i].to]=;
- }
- }
- for (int i=; i<=N; i++) d[S][i]=dis[i];
- }
- int Min(int a,int b)
- {
- if (a==-) return b;
- if (a>b) return b; else return a;
- }
- int dp[<<][],zt[maxn];
- void DP()
- {
- for (int i=; i<=(<<K)-; i++)
- for (int j=; j<=K+; j++)
- if (dp[i][j]!=-)
- for (int k=; k<=K+; k++)
- if ((i&zt[k])==zt[k])
- dp[i|(<<(k-))][k]=Min(dp[i|(<<(k-))][k],dp[i][j]+d[j][k]);
- }
- int main()
- {
- N=read(),M=read(),K=read();
- for (int u,v,w,i=; i<=M; i++)
- u=read(),v=read(),w=read(),insert(u,v,w);
- for (int i=; i<=K+; i++) SPFA(i);
- C=read();
- for (int x,y,i=; i<=C; i++)
- x=read(),y=read(),zt[y]|=(<<(x-));
- memset(dp,-,sizeof(dp)); dp[][]=;
- DP(); ans=0x7fffffff;
- for (int i=; i<=K+; i++)
- if (dp[(<<K)-][i]!=-) ans=Min(dp[(<<K)-][i]+d[i][N],ans);
- printf("%d",ans);
- return ;
- }
开了两个DeBug,第一次忘删了OLE,删了一个还剩一个又WA了...然后卡时..
【BZOJ-1097】旅游景点atr SPFA + 状压DP的更多相关文章
- D. 旅游景点 Tourist Attractions 状压DP
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...
- 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 ...
- bzoj [POI2007]旅游景点atr 状态压缩+Dij
[POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 2258 Solved: 595[Submit][Status][D ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...
- BZOJ 3195 [Jxoi2012]奇怪的道路 | 状压DP
传送门 BZOJ 3195 题解 这是一道画风正常的状压DP题. 可以想到,\(dp[i][j][k]\)表示到第\(i\)个点.已经连了\(j\)条边,当前\([i - K, i]\)区间内的点的度 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )
水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ------------------- ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
随机推荐
- javascript中的链表结构
1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...
- Exploit利用学习1:MS09-001
目标 IP: Kali系统IP: 1.使用Metasploit框架,在kali终端输入msfconsole打开Metasploit:如下图 2.搜索相关模块:search ms09-001 找到一个可 ...
- X200s,Debian 8(Jessie) 安装流水帐
1. U盘启动安装 a. 因为无线网卡驱动是non-free,需要另外下载,对应X200s,文件是iwlwifi-5000-5.ucode,下完放到安装U盘的根目录下,安装时就不会再提示而是直接安装 ...
- PHP高效率写法及原因
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...
- 在Mac mini上安装 ESXi 5.5
Mac mini 是 mid 2011 版本的, 安装原版ESXi 5.5 update 1 非常顺利, 没遇到任何问题. 提示: 1. 安装会初始化整个硬盘, 有数据要先备份 2. ESXi只使用有 ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- Linux 网络编程详解六(多进程服务器僵尸进程解决方案)
小结:在点对点p2p程序中,服务器端子程序退出,子进程会主动发送信号,关闭父进程,但是这种模式导致服务器只能支持一个客户端连接,本章节中使用新的框架,子进程退出,不主动发送信号关闭父进程,而是父进程安 ...
- eval的对于验证数学公式的用处
var a=10,b=20; var s=a+b+((a/b)+(a+(a-b)))+(11)/a; var r=eval(s); console.log(r); 只要不报错,说明公式正确, 报错公式 ...
- C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8"的响应正文。...
在调试一个WebApi程序时,出现下面错误: 通过分析怀疑是未添加序列化属性引起的,实体类改为下面结构后,问题依旧: 通过查阅资料和不断尝试,修改实体类的属性注解搞定:
- ContentProvider备份短信,以xml文件存储
因为短信的内容已经通过ContentProvider暴露出来,所以我们可以直接用内容解析者获取短信内容. 想要获取短信内容,你需要知道的一些东西: 1.Uri uri = Uri.parse(&quo ...