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 首先,感谢以下几 ...
随机推荐
- ios第三方分享到qq、微信、人人网、微博总结
我们开发出来的APP通常要通过第三方分享到其他社交平台,如qq.微博微信 等.通过分享可以提高APP的传播效率,增加APP的曝光率,因此也算是APP功能 里的标配了吧.目前常用的第三方分享途径有qq. ...
- ORACLE-用户常用数据字典的查询使用方法
一.用户 查看当前用户的缺省表空间 SQL> select username,default_tablespace from user_users; USERNAME DEFAULT_TABLE ...
- Jni中C++和Java的参数传递
Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用V ...
- 7.FPGA中的同步复位与异步复位
1.异步复位 always @ ( posedge sclk or negedge s_rst_n ) if ( !s_rst_n ) d_out <= 1'b0; else d_out < ...
- JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作
1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; i ...
- 使用Log Explorer查看和恢复数据
由于一次意外操作,把QC数据库中的BUG表数据给删掉了.崩溃-上网找了下恢复方法,找到一款Log Explorer.下载安装使用后,发现这款软件的确不错,收藏ing. 本次的使用的Log Expl ...
- Node.js 学习(二) 创建第一个应用
如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...
- 本地wordpress博客系统安装搭建实践
我们按步骤来, (1)安装XAMPP集成软件包 wordpress 的运行要求是在 php + MySQL + Apache的服务器环境,所以要先搭建该环境,我用的是XAMPP软件包,安装很方便. 下 ...
- [转]Eclipse遇到的常见问题
1. 提示:“Setting build path” has encountered a problem,Could not write file D:\\workspace\demo\.class ...
- xcode 运行报错 Command /usr/bin/codesign failed with exit code 1
因为更换了证书,导致在运行时报错 Command /usr/bin/codesign failed with exit code 1,查看了网上各种方法,最后发现以下两个值没有同步更新