[CodeForces238E]Meeting Her(图论+记忆化搜索)
Description
题目链接:Codeforces
Solution
因为路线随机,所以找出各路线最短路必须经过的点,在这个点必定能上车
直接floyd暴力找割点
然后不断用k条公交车路线来更新DP答案,直到更新不了为止,dp[i]表示从点i到终点的答案
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 1100
using namespace std;
int n,m,g[N][N],S,T,s[N],t[N],dp[N],cnt[N],Ans[N];
bool cut[N][N],vis[N];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int dfs(int u,int cur){
if(vis[u]) return dp[u];
vis[u]=1;int tmp=-1;
for(int v=1;v<=n;++v)
if(g[u][v]==1&&g[u][t[cur]]==g[v][t[cur]]+1)
tmp=max(tmp,dfs(v,cur));
if(tmp==-1) tmp=1e9;
tmp=min(tmp,Ans[u]);
return dp[u]=tmp;
}
int main(){
n=read(),m=read(),S=read(),T=read();
memset(g,0x3f,sizeof(g));
for(int i=1;i<=n;++i)g[i][i]=0;//注意自己到自己初始化为0
while(m--){
int u=read(),v=read();
g[u][v]=1;//有向图
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
m=read();
for(int k=1;k<=m;++k){
s[k]=read(),t[k]=read();
if(g[s[k]][t[k]]==0x3f3f3f3f)continue;//这里不特判会RE
for(int i=1;i<=n;++i)
if(g[s[k]][i]+g[i][t[k]]==g[s[k]][t[k]])
cnt[g[s[k]][i]]++;
for(int i=1;i<=n;++i)
if(g[s[k]][i]+g[i][t[k]]==g[s[k]][t[k]]){
if(cnt[g[s[k]][i]]==1) cut[k][i]=1;
cnt[g[s[k]][i]]=0;
}
}
bool flag=1;
memset(dp,0x3f,sizeof(dp));
memset(Ans,0x3f,sizeof(Ans));
Ans[T]=0;
while(flag){
flag=0;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
if(cut[i][j]){
memset(vis,0,sizeof(vis));
int tmp=dfs(j,i)+1;
if(Ans[j]>tmp){
flag=1;
Ans[j]=tmp;
}
}
}
if(Ans[S]>233) Ans[S]=-1;
printf("%d\n",Ans[S]);
return 0;
}
[CodeForces238E]Meeting Her(图论+记忆化搜索)的更多相关文章
- 非常完整的线性DP及记忆化搜索讲义
基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- HDU1978 记忆化搜索
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- bzoj4562: [Haoi2016]食物链--记忆化搜索
这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...
随机推荐
- Native Method
While a 100% pure Java solution is nice in principle, realistically, for an application, there are s ...
- CAD鼠标移动到对象时显示对象内容
//定义事件 Editor ed = doc.Editor; ed.PointMonitor += new PointMonitorEventHandler(ed_Po ...
- SaaS “可配置”和“多租户”架构的几种技术实现方式
1.数据存储方式的选择 多租户(Multi-Tenant ),即多个租户共用一个实例,租户的数据既有隔离又有共享,说到底是要解决数据存储的问题. 常用的数据存储方式有三种. 方案一:独立数据库 一 ...
- Python基础学习之变量赋值
1.赋值操作符 Python语言中,等号(=)是主要的赋值操作符: >>> aInt=-100 >>> aString='this is a string' > ...
- I2C总线协议学习笔记 (转载)
1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL. SDA传输数据是大端传输,每次传输8bit,即一字节. 支持多主控(multimastering),任何时间点只能有一 ...
- MySQL一致性非锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...
- maven项目右键快捷方式,然后点击Run As
在某一个maven项目右键快捷方式,然后点击Run As就可以发现几个Maven的命令: 1.Maven Build: 这个命令用于编译Maven工程,执行命令后会在target文件夹中的classe ...
- Docker中的三个基本概念容器(container)、镜像(image)和仓库(registry)之间有什么关系?
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷.环境变量.用户等).镜像不包含任何动态数据,其内容在构建之 ...
- app上线
不管第一次还是第二次APP上线都需要三样东西:开发者证书,appID,描述文件
- MyBatis简单了解
MyBatis 是什么? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 码,并提供了一个简单易用的 AP ...