Description

click me

Solution

先从起点和终点各一遍最短路(spfa或者Dijkstra的堆优化),然后拓扑,如果一个点在零环上且到起点、终点的距离之和符合题目要求,输出-1,否则dp:
设dpi,jdp_{i,j}为到第ii个点、路径长度为最短路+j+j的方案数,转移应该非常显然了吧

Code

#include<bits/stdc++.h>using namespace std;typedef long long ll;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef set<int> SI;
typedef set<int>::iterator siit;
#define For(i , j , k) for (register int i = (j) , i##_end_ = (k) ; i <= i##_end_ ; ++ i)
#define Fordown(i , j , k) for (register int i = (j) , i##_end_ = (k) ; i >= i##_end_ ; -- i)
#define Set(a , b) memset(a , b , sizeof(a))
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define fir first
#define sec second
#define pc putchar
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#ifdef hany01
#define debug(...) fprintf(stderr , __VA_ARGS__)
#else
#define debug(...)
#endiftemplate <typename T> inline bool chkmax(T &a , T b) { return a < b ? (a = b , 1) : 0; }
template <typename T> inline bool chkmin(T &a , T b) { return b < a ? (a = b , 1) : 0; }int _ , __;
char c_;
inline int read()
{for (_ = 0 , __ = 1 , c_ = getchar() ; !isdigit(c_) ; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; isdigit(c_) ; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}inline void File()
{
#ifdef hany01freopen("park.in" , "r" , stdin);freopen("park.out" , "w" , stdout);
#endif
}const int maxn = 100005, maxm = 200005, maxk = 53;int n, m, k, Mod, beg1[maxn], nex1[maxm], v1[maxm], w1[maxm], beg2[maxn], nex2[maxm], v2[maxm], w2[maxm], dis1[maxn], dis2[maxn], d[maxn], q[maxn << 2], cnt, e1, e2, dp[maxn][maxk], T, head, tail;
bool vis[maxn];inline void add1(int uu, int vv, int ww) { v1[++ e1] = vv; w1[e1] = ww; nex1[e1] = beg1[uu]; beg1[uu] = e1; }
inline void add2(int uu, int vv, int ww) { v2[++ e2] = vv; w2[e2] = ww; nex2[e2] = beg2[uu]; beg2[uu] = e2; }inline void mod(int &x) { if (x >= Mod) x -= Mod; }inline void Init()
{int uu, vv, ww;n = read(); m = read(); k = read(); Mod = read();Set(beg1, 0); Set(beg2, 0); e1 = e2 = 0; Set(d, 0); Set(dp, 0);while (m --) uu = read(), vv = read(), ww = read(), add1(uu, vv, ww), add2(vv, uu, ww);
}inline void SPFA1()
{q[head = tail = 1] = 1;Set(dis1, 127); dis1[1] = 0;while (head <= tail) {register int u = q[head]; vis[u] = 0; ++ head;for (register int i = beg1[u]; i; i = nex1[i]) if (chkmin(dis1[v1[i]], dis1[u] + w1[i]) && !vis[v1[i]]) q[++ tail] = v1[i], vis[v1[i]] = 1;}
}inline void SPFA2()
{q[head = tail = 1] = n;Set(dis2, 127); dis2[n] = 0;while (head <= tail) {register int u = q[head]; vis[u] = 0; ++ head;for (register int i = beg2[u]; i; i = nex2[i]) if (chkmin(dis2[v2[i]], dis2[u] + w2[i]) && !vis[v2[i]]) q[++ tail] = v2[i], vis[v2[i]] = 1;}
}inline void Pickout()
{For(u, 1, n) for (register int i = beg1[u]; i; i = nex1[i]) if (dis1[v1[i]] == dis1[u] + w1[i]) ++ d[v1[i]];cnt = 0;For(i, 1, n) if (!d[i]) q[++ cnt] = i;for (register int i = 1; i <= cnt; ++ i) {register int u = q[i];for (register int j = beg1[u]; j; j = nex1[j]) if (dis1[v1[j]] == dis1[u] + w1[j] && !(-- d[v1[j]])) q[++ cnt] = v1[j];}
}inline bool Assert() {For(i, 1, n) if (d[i] && dis1[i] + dis2[i] <= dis1[n] + k) { puts("-1"); return 1; }return 0;
}inline void DP()
{dp[1][0] = 1;For(K, 0, k) {For(i, 1, cnt) for (register int j = beg1[q[i]]; j; j = nex1[j])if (dis1[v1[j]] == dis1[q[i]] + w1[j]) mod(dp[v1[j]][K] += dp[q[i]][K]);For(u, 1, n) for (register int j = beg1[u]; j; j = nex1[j])if (dis1[v1[j]] < dis1[u] + w1[j] && K - dis1[v1[j]] + dis1[u] + w1[j] <= k) mod(dp[v1[j]][K - dis1[v1[j]] + dis1[u] + w1[j]] += dp[u][K]);}
}inline void Print()
{int Ans = 0;For(K, 0, k) mod(Ans += dp[n][K]);printf("%d\n", Ans);
}int main()
{File();T = read();while (T --) {Init();SPFA1();SPFA2();Pickout();if (Assert()) continue;DP();Print();}return 0;
}
//凄凉宝剑篇,羁泊欲穷年。
//黄叶仍风雨,青楼自管弦。
//新知遭薄俗,旧好隔良缘。
//心断新丰酒,销愁又几千。
//--李商隐《风雨》

NOIP2017 逛公园 (拓扑,dp,最短路)相关推荐

  1. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  2. NOIP2017 逛公园

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  3. [NOIP2017]逛公园

    策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每 ...

  4. NOIP2017逛公园

    在WA了接近20遍后,本蒟蒻终于切掉了逛公园.. 逛公园的题意为求出图中从1到n路径长度<=d(最短路)+k 的 路径条数. 这道题十分的像luogu 1608 路径统计,虽然算法完全不一样, ...

  5. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  6. NOIP2017 逛公园(最短路+记忆化搜索)

    Description Input Output Example input 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 3 4 1 3 5 2 1 5 3 2 2 0 10 ...

  7. 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环

    题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ ...

  8. JZOJ 5475. 【NOIP2017提高组正式赛】逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张n个点m条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,n号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...

  9. NOIP2017 D1T3 逛公园

    逛公园 题目背景: NOIP2017 D1T3 分析:记忆化搜索 + 最短路 竟然卡常数--因为考场上并没有调出来spfa的转移,所以这道题就只有30pts了·····下来才发现,这不是一道非常显然的 ...

  10. 【NOIP2017提高组】逛公园

    逛公园 题目背景 NOIP2017提高组 DAY1 T3 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口,N 号点是公 ...

最新文章

  1. SSLGET ×××综合实验题
  2. python爬虫入门-Python 爬虫从入门到进阶之路(一)
  3. Androidi性能优化之多线程和同步
  4. ionic ui框架及creator使用帮助
  5. 学习excel数据分析_为什么Excel是学习数据分析的最佳方法
  6. 《.NET内存管理宝典》在京东上架销售啦!
  7. 软件质量的理解 摘录
  8. 表关联使用INNER JOIN实现更新功能
  9. 【Android】Error:Execution failed for task ':app:lint'
  10. python中ascii的应用_Python程序中的ascii()
  11. 助教日志—请沈航13级同学将GIT地址和CNBLOG地址发到这篇博文的评论中
  12. 关于MyEclipse 10 破解程序打开的原因
  13. 【iOS-Cocos2d游戏开发】解决滚屏背景/拼接地图有黑边(缝隙)
  14. 上海二工大 - 健康日报AutoCheck
  15. 双显卡(Intel+Nvidia)笔记本配置cuda开发环境
  16. SpringCloud(4)— 统一网关Gateway
  17. 完工后的决算书范本_装修竣工结算书范本谁能给份
  18. 【Re-ID】现有方法调研 - 无监督/半监督方法 - 其他方法
  19. 宿舍管理系统之登录功能
  20. 学习编程太枯燥?12款助你学编程的免费游戏

热门文章

  1. 机器学习之线性回归 Linear Regression(三)scikit-learn算法库
  2. 本地数据下,radiobutton和图片组合,利用adapter+listview进行单选
  3. 股票交易接口的分类webService接口
  4. 被问:这个BUG为什么没测出来?该如何回答
  5. Jetpack Compose - Modifier入门篇
  6. Document.readyState 如何使用和侦听
  7. 基于ssm框架开发的图书馆管理系统
  8. 逐鹿战神--ios技术支持
  9. 在 Linux 中安装 Firefox
  10. sap事务代码如何收藏_SAP仓库管理模块事务代码大全