洛谷P3953 逛公园 [noip2017] 图论+dp
正解:图论(最短路)+dp(记忆化搜索)
解题报告:
这题真的是个好东西!
做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT
不过其实感觉还挺幸运的,好歹是考前发现?不然考完才知道就GG了...
先正儿八经讲完解法再吐槽自己...
先dij跑一遍最短路
然后再走一遍,我们可以跑到d+k相当于我们可以浪费k
然后dp[i][j]表示跑到第i个点了还可以浪费j的方案数
最后Σdp[n][1~k]就欧克辽...
就是个记忆化搜索
对了了解到好像说自古D1有一dp?那如果按照去年套路来说T1数论T2大模拟T3就多往dp上想?这题的话就记忆化搜索嘛也是dp对趴qwq
哦然后关于转移,这个大概是唯一难点?
写一下关键好了 理解一下,从u到v我们强制要求跑uv边,那转移造成的的浪费就是
dis[v]+w[edge(u,v)]-dis[u]
就还能浪费 lf-(上面那坨)
然后初始状态是跑到了f[n][0]的时候f[n][0]=1
over
然后贴下代码:
#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i)
#define pr pair<int,int>
#define mp make_pair
,M=;
],T;
long long ans;
struct ed{int to,next,wei;}edge1[M],edge2[M];
],flg;
priority_queue< pr , vector<pr> , greater<pr> >Q;
inline int read()
{
;;
'))ch=getchar();
if(ch=='-')ch=getchar();
)+(x<<)+(ch^'),ch=getchar();
return y?x:-x;
}
inline void pre()
{
memset(vis,,/,,,sizeof(head2));
memset(instack,,,;ans=;flg=;memset(edge1,,,sizeof(edge2));
}
inline void add1(int x,int y,int z){edge1[++tot].to=y;edge1[tot].next=head1[x];edge1[tot].wei=z;head1[x]=tot;}
inline void add2(int x,int y,int z){edge2[tot].to=y;edge2[tot].next=head2[x];edge2[tot].wei=z;head2[x]=tot;}
inline void dij()
{
Q.push(mp(,n));dis[n]=;
while(!Q.empty())
{
int t=Q.top().second;Q.pop();
)continue;
vis[t]=;
;i=edge2[i].next)
if(dis[edge2[i].to]>dis[t]+edge2[i].wei){dis[edge2[i].to]=dis[t]+edge2[i].wei;Q.push(mp(dis[t]+edge2[i].wei,edge2[i].to));}
}
}
int dfs(int u,int lf)
{
,;;;
;i=edge1[i].next)
{ && temp<=cjk)goldgenius=(goldgenius+dfs(edge1[i].to,temp))%mod;;}
)goldgenius=;instack[u][lf]=;
return f[u][lf]=goldgenius;
}
int main()
{
// freopen("cjk.in","r",stdin);
// freopen("cjk.out","w",stdout);
T=read();
while(T--)
{
pre();n=read();m=read();cjk=read();mod=read();
rp(i,,m){int t1=read(),t2=read(),t3=read();add1(t1,t2,t3);add2(t2,t1,t3);}
dij();
rp(i,,cjk){memset(instack,,,i))%mod;}
flg?printf("-1\n"):printf("%lld\n",ans);
}
;
}
QAQ
吐槽:
苍了天了...港真我真的很震惊了,毕竟图论的题我也做了不少了一直打得是错的为什么都A了?题目也太水了点趴都???我真的???
然后港下我哪儿错了,就是优先队列是不能更改那个值的趴好像,所以你直接修改不会使得顺序改变所以其实是错的....ummm..所以为什么我之前对了呢...
然后贴下真正正确的代码...
inline void dij()
{
Q.push(mp(,n));dis[n]=;
while(!Q.empty())
{
int t=Q.top().second;Q.pop();
if(vis[t])continue;
vis[t]=;
;i=edge2[i].next)
if(dis[edge2[i].to]>dis[t]+edge2[i].wei){dis[edge2[i].to]=dis[t]+edge2[i].wei;Q.push(mp(dis[t]+edge2[i].wei,edge2[i].to));}
}
}
!!
a还有个玄学操作?就是我发现我之前A的代码有个判断好像错了?我就删了?然后就成功T了一个点???
是这样的:
if(vis[t] && t-1)continue;
然后我改成这样,就会T:
if(vis[t])continue;
我又改成这样,还是T:
if(vis[t] && t!=1)continue;
我就很懵,于是改成这样,依然是T的:
if(vis[t] && t-1!=0)continue;
这是什么玄学啊...哭了.不知道是常数太大还是怎么?
哦但是我写spfa一发过...也是清奇x
upd:11.9 写完最短路模板实在不服气于是我就就就又去做了下...然后加一堆register就卡着时间过辣!
洛谷P3953 逛公园 [noip2017] 图论+dp的更多相关文章
- 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)
洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...
- 2018.11.01 洛谷P3953 逛公园(最短路+dp)
传送门 设f[i][j]f[i][j]f[i][j]表示跟最短路差值为iii当前在点jjj的方案数. in[i][j]in[i][j]in[i][j]表示在被选择的集合当中. 大力记忆化搜索就行了. ...
- 洛谷P3953 逛公园(dp 拓扑排序)
题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...
- 洛谷P3953 逛公园
DP+图论大毒瘤. 推荐这个博客. 先跑两遍最短路,搞掉一些无用点. 然后选出最短路上的边,做拓扑排序. 然后每层DP. 具体看代码. 用到的数组较多,记得清空. #include <cstdi ...
- 洛谷P3953逛公园
题目 作为\(NOIp2017D1T3\) 这个题还是很良心的,至少相对于\(NOIp2018\)来说,希望\(NOIp2019\)不会这么坑吧. 这个题可以作为记忆化搜索的进阶题了,做这个题的方法也 ...
- 洛谷 P3953 逛公园
题目链接 思路 首先没有0边,且k为0的情况就是最短路计数. 如果k不为0,看到k<=50,想到dp. 设f[u][i]表示到达u点比最短路多走i的路径数,转移到v点. f[u][i]+=f[v ...
- 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】
spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v ...
- 洛谷 P1053 逛公园 解题报告
P3953 逛公园 问题描述 策策同学特别喜欢逛公园. 公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负 ...
- UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
"Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...
随机推荐
- iOS开发-- 使用VVDocumenter-Xcode添加代码注释
在开发Java代码过程中,我们只需在Eclipse中敲/**即可生成字段.方法对应的文档,简单便捷. 在Xcode如果想添加文档注释,需要花费很多时间,有没有简单.快速的方法搞定这一切? 在网上搜索了 ...
- iOS UIImage:获取图片主色调
本文转载至 http://www.wahenzan.com/a/mdev/ios/2015/0325/1677.html -(UIColor*)mostColor{ #if __IPHONE_OS_V ...
- <转>python字典排序 关于sort()、reversed()、sorted()
一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...
- 【JSON.NET】json序列化小驼峰格式(属性名首字母小写)
废话少说,先上代码 var setting = new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serializ ...
- Windows server 创建FTP 包括ftp的账号密码设置
原始文章 : https://blog.csdn.net/missingshirely/article/details/50767043 最近要做个FTP上传资源的工具,以前都是我提供目录,由公司网管 ...
- openlayers中利用vector实现marker的方式
项目需要一个小型的gis.openlayers,geoserver,postgres组合是比较好的选择. openlayers的marker层好像不支持拖动操作.通过研究api发现,可以利用vecto ...
- JS方法 - 字符串处理函数封装汇总 (更新中...)
一.计算一段字符串的字节长度 字符串的charCodeAt()方法, 可返回字符串固定位置的字符的Unicode编码,这个返回值是0-65535之间的整数,如果值<=255时为英文,反之为中文. ...
- jade(pug)学习笔记(待填充.......)
深刻认识到总结知识点的重要性,不然遇到似曾相识的问题,要翻老半天的百度才能解决.20171018 pug——文字内部嵌入结构 比如: <a class = "href"> ...
- C++ #include—尖括号和双引号的区别
如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作#include <文件名>,但有时候又会出现#include "文件名".你会 ...
- android 线程间的通信
(转自:http://www.cnblogs.com/allin/archive/2010/05/19/1738800.html) andriod提供了 Handler 和 Looper 来满足线程间 ...