ZOJ2923 Calculate Roads(SPFA上的dp)
算是学了图dp后的第一次应用吧。题目其实真的是非常不严谨,什么都没说,基本靠猜,而且严格来说数据应该会有爆int的,不过不管那么多啦,思路对了就好- -0
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
#define maxn 5000
#define maxm 1000000
#define inf 0x3f3f3f3f
using namespace std; vector<int> G[maxn+50]; struct Node
{
int v,k;
Node(){}
Node(int vi,int ki):v(vi),k(ki){}
}; int m,n,k;
int dis[maxn+50][55];
int num[maxn+50][55];
int vis[maxn+50][55];
int vtype[maxn]; int main()
{
while(cin>>m>>n>>k)
{
for(int i=0;i<=n;i++) G[i].clear();
int xi,yi;
for(int i=0;i<n;i++) {
scanf("%d%d",&xi,&yi);
vtype[xi]=yi;
}
for(int i=0;i<m;i++){
scanf("%d%d",&xi,&yi);
G[xi].push_back(yi);
G[yi].push_back(xi);
}
memset(dis,0x3f,sizeof(dis));
memset(num,0,sizeof(num));
queue<Node> que;
if(vtype[1]==0){
dis[1][0]=0;
num[1][0]=1;
que.push(Node(1,0));
}
else{
dis[1][1]=0;
num[1][1]=1;
que.push(Node(1,1));
}
while(!que.empty()){
Node xx=que.front();que.pop();
vis[xx.v][xx.k]=0;
int u=xx.v; int kk=xx.k;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(vtype[v]==0){
if(vis[v][kk]){
if(dis[u][kk]+1<dis[v][kk]){
dis[v][kk]=dis[u][kk]+1;
num[v][kk]=num[u][kk];
}
else if(dis[u][kk]+1==dis[v][kk]){
num[v][kk]+=num[u][kk];
}
}
else{
if(dis[u][kk]+1<dis[v][kk]){
dis[v][kk]=dis[u][kk]+1;
num[v][kk]=num[u][kk];
que.push(Node(v,kk));
vis[v][kk]=1;
}
else if(dis[u][kk]+1==dis[v][kk]){
num[v][kk]+=num[u][kk];
que.push(Node(v,kk));
vis[v][kk]=1;
}
}
}
else{
if(kk==k) continue;
if(vis[v][kk+1]){
if(dis[u][kk]+1<dis[v][kk+1]){
dis[v][kk+1]=dis[u][kk]+1;
num[v][kk+1]=num[u][kk];
}
else if(dis[u][kk]+1==dis[v][kk+1]){
num[v][kk+1]+=num[u][kk];
}
}
else{
if(dis[u][kk]+1<dis[v][kk+1]){
dis[v][kk+1]=dis[u][kk]+1;
num[v][kk+1]=num[u][kk];
que.push(Node(v,kk+1));
vis[v][kk+1]=1;
}
else if(dis[u][kk]+1==dis[v][kk+1]){
num[v][kk+1]+=num[u][kk];
que.push(Node(v,kk+1));
vis[v][kk+1]=1;
}
}
}
}
}
int mdis=inf;
for(int i=0;i<=k;i++){
mdis=min(mdis,dis[n][i]);
}
if(mdis==inf) {
puts("Impossible!");continue;
}
int ans=0;
for(int i=0;i<=k;i++){
if(dis[n][i]==mdis) ans+=num[n][i];
}
cout<<ans<<endl;
}
return 0;
}
ZOJ2923 Calculate Roads(SPFA上的dp)的更多相关文章
- ZOJ1232 Adventure of Super Mario spfa上的dp
很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...
- 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 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- UVA - 10131Is Bigger Smarter?(DAG上的DP)
题目:UVA - 10131Is Bigger Smarter? (DAG) 题目大意:给出一群大象的体重和IQ.要求挑选最多的大象,组成一个序列.严格的体重递增,IQ递减的序列.输出最多的大象数目和 ...
- BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...
- 区间和序列上的dp
区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...
- (板子)缩点 + DAG上的DP(深搜)luogu P3387
板子传送门 根据题目意思,我们只需要找出一条点权最大的路径就行了,不限制点的个数.那么考虑对于一个环上的点被选择了,一整条环是不是应该都被选择,这一定很优,能选干嘛不选.很关键的是题目还允许我们重复经 ...
- Travelling(spfa+状态压缩dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others ...
- 【学习笔记】有向无环图上的DP
手动博客搬家: 本文发表于20180716 10:49:04, 原地址https://blog.csdn.net/suncongbo/article/details/81061378 首先,感谢以下几 ...
随机推荐
- 公钥私钥 ssl/tsl的概念
一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,只有自己知道的叫私钥3,用公钥加密的数据只有对应的私钥可以解密4,用私钥加密的数据只有对应的公钥可以解密5,如果可以用公钥解密,则必然是对应的私 ...
- Linux下安装宋体以及微软雅黑字体
最近工作用itext生成pdf在windows环境下没有出现中文乱码而在linux下出现中文乱码,打开pdf查看pdf编码,以及显示的编码,发现编码并没有对应.原因是使用的宋体和微软雅黑在linux环 ...
- bzoj 3223/tyvj 1729 文艺平衡树 splay tree
原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...
- mysql存储过程执行权限问题
tags: mysql PROCEDURE 存储过程 definer SECURITY 权限 以下存储过程,限定了DEFINER为root,也就是root之外的账户是无法调用这个存储过程的. 1 2 ...
- Entity Framework 泛型使用
因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了.我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类.那就要求我们的父类必须使用泛型来实现. ...
- PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...
- UML 用例图,时序图,活动图的定义以及区别
1.用例图,时序图,活动图的定义 1.用例图: 用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色" ...
- Mac上安装 mySql
今天在mac系统上安装了 mySql 和大家分享下 安装的过程.. 首先 第一步 需要在oracle的网站下载 mysql 的mac 版本. 下载地址如下: http://www.mysql.com/ ...
- hdu 4046 Panda 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046 When I wrote down this letter, you may have been ...
- ios 缓存策略
NSURLRequestCachePolicy 缓存策略 1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略, 如果缓存不存在,直接从服务端 ...