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 首先,感谢以下几 ...
随机推荐
- Python学习教程(learning Python)--1.3 Python数据输入
多数应用程序都有数据输入语句,用于读入数据,和用户进行交互,在Python语言里,可以通过raw_input函数实现数据的从键盘读入数据操作. 基本语法结构:raw_input(prompt) 通常p ...
- DB2建立不记录日志的表
)); ,'JACK'); ,'Timo'); -----建立无日日志表 --方法一:(表存在) CREATE TABLE TB_7 LIKE TB_6 NOT LOGGED INITIALLY; - ...
- RMAN 报:ORA-19504 ORA-27038
在itpub中看到下面的问题: oracle 10g备份脚本如下run{allocate channel d1 device type disk MAXPIECESIZE=100M;crosschec ...
- hdu 5264 pog loves szh I
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5264 pog loves szh I Description Pog has lots of stri ...
- iOS-添加测试设备Identifier
第一步:确认你的设备已经连接 第二步:点击xcode上"Windows"标签,选择"Devices" 第三步:在弹出的左框选择你要添加的设备.在右边框里可以找到 ...
- 关于1>LINK : fatal error LNK1168: 无法打开 ....exe或者....dll进行写入的问题
我们用VS编译器运行我们的程序时候,可能会出现关于1>LINK : fatal error LNK1168: 无法打开 ...dll 进行写入或者是1>LINK : fatal err ...
- VS 与 SQLite数据库 连接
SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...
- 【AFNetworking】AFNetworking源码阅读(一)
1. 前言 2. iOS Example代码结构 3.AFNetworkActivityIndicatorManager 4. UIRefreshControl+AFNetworking 5. AFN ...
- unity2d之2d帧动画创建
在2d游戏中帧动画的应用是非常广泛的,那么如何在unity中创建一个帧动画,主要是下面几个步骤. 原文地址 :http://blog.csdn.net/dingkun520wy/article/de ...
- String、StringBuilder、StringBuffer
String String ...