题目
题意: 给定n个点,m条有向边。给定起点S和终点T。求最短路的方案数 + 仅比最短路长度大1的路径的方案数.
思路: Dij + dp.涉及到dp我就不会了。 最短路方案数易求,比最短路长度大1的路径方案数是关键。Dij预处理距离数组dist[] 考虑dp: f[u][k]: 表示到u点长度为dist[u] + k的方案数 答案为f[T][0] + f[T][1] 转移: f[j][k] = f[j][k] + f[u][k], if(dist[j] == dist[u] + w[i]). 到达u长度为dist[u] + k的方案数,会被到j长度为dist[j] + k所继承,因为j恰好可以通过u到达。 f[j][1] = f[j][1] + f[u][0], if(dist[j] + 1 == dist[u] + w[i]) 到达j长度为dist[j] + 1的方案数,可以继承到达u长度为dist[u]的方案数。
// Problem: 观光
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/385/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define OldTomato ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define fir(i,a,b) for(int i=a;i dist[u] + w[i])
{
dist[j] = dist[u] + w[i];
q.push({dist[j],j});
cnt[j] = cnt[u];
}
else if(dist[j] == dist[u] + w[i])
{
cnt[j] += cnt[u];
}
}
}
}
struct s2 //按照dist数组排序
{
int id;
int dis;
bool operator
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?