这是一道非常好的题目,融合了很多知识点。


ZOJ1232-Adventrue of Super Mario

  这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔

  题意就不累述了,注释有写,难点在于状态转移方程的确立和SPFA的过程

 //最短路:Floyd+SPFA(BFS)+DP
//Time:20Ms Memory:336K
//题目很好,数据较弱,网上部分代码有些问题却能够A掉
//题意:超级马里奥要从A+B处背着公主以最短路程到达1处,其中1-A是村庄,剩下的是城堡
// 有可使用K次可飞过L长的靴子(每次都以结点开始或结束),求最短路长
//首先需要得到任意两点之间的最短路-Floyd较为简便(10^5次操作也能接受)
//其次需要利用BFS从A+B处开始遍历并进行状态转移-BFS+DP
//构造状态:DP[i][k]:从i到A+B经过k次瞬移得到的最短路
//状态转移方程:
//能够从x瞬移到y:dp[x][k] = min(dp[x][k], dp[y][k - 1], dp[y][k] + d[x][y])
//不能从x瞬移到y:dp[x][k] = min(dp[x][k], dp[y][k] + d[x][y])
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std; #define INF 0x3f3f3f3f
#define MAX 105 vector<int> e[MAX]; //邻接表
int A, B, M, L, K;
int d[MAX][MAX]; //distance
bool fly[MAX][MAX]; //能否瞬移
int vis[MAX];
int dp[MAX][]; //dp[i][k]:从i到A+B经过k次瞬移得到的最短路 void floyd(int N)
{
for (int i = ; i <= N; i++)
d[i][i] = ;
for (int k = ; k <= N; k++)
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
if (d[i][j] > d[i][k] + d[k][j])
{
d[i][j] = d[i][k] + d[k][j];
if (k <= A && d[i][j] <= L)
{
fly[i][j] = true;
e[i].push_back(j);
}
}
} int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out-2.txt", "w", stdout);
int T;
scanf("%d", &T);
while (T--) {
memset(d, INF, sizeof(d));
memset(fly, false, sizeof(fly));
memset(e, , sizeof(e));
scanf("%d%d%d%d%d", &A, &B, &M, &L, &K);
while (M--) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
d[v][u] = d[u][v] = w;
e[v].push_back(u);
e[u].push_back(v);
if (w <= L) fly[u][v] = fly[v][u] = true;
} floyd(A + B);
//类似SPFA的过程(BFS)
memset(dp, INF, sizeof(dp));
for (int i = ; i <= K; i++)
dp[A + B][i] = ;
for (int i = ; i <= A + B; i++)
dp[i][] = d[i][A + B];
for (int k = ; k <= K; k++)
{
memset(vis, false, sizeof(vis));
queue<int> q;
q.push(A + B); //从A+B开始遍历
vis[A + B] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = ; i < e[cur].size(); i++)
{
int u = e[cur][i];
int tmp = dp[u][k];
//状态转移
if (fly[u][cur]) //可瞬移
dp[u][k] = min(dp[u][k], dp[cur][k - ]);
dp[u][k] = min(dp[u][k], dp[cur][k] + d[cur][u]);
//需要转移状态的条件 - 没有访问过 or 最短路长变更
if (!vis[u] || tmp != dp[u][k])
q.push(u);
vis[u] = true;
}
}
}
printf("%d\n", dp[][K]);
}
return ;
}

ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)的更多相关文章

  1. 2017 ACM/ICPC Asia Regional Shenyang Online spfa+最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  2. 【ACM程序设计】求短路 Floyd算法

    最短路 floyd算法 floyd是一个基于贪心思维和动态规划思维的计算所有点到所有点的最短距离的算法. P57-图-8.Floyd算法_哔哩哔哩_bilibili 对于每个顶点v,和任一顶点对(i, ...

  3. ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))

    求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法. POJ1511(ZOJ2008)-Invitation Cards 改变构造邻接表的方法后,分为两种解法 解法一 ...

  4. ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)

    //POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...

  5. hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs

    题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少? 求最短路的最大距离 #include& ...

  6. ACM/ICPC 之 一道不太简单的DP面试题(Geeksforgeeks)

    题面来源:geeksforgeeks/1993 题解:geeksforgeeks 题目简述:给一个m*n的矩阵,计算从(1,1)到(m,n)的所有不回退路径中,经过k次转向后的路径有多少条 输入T个样 ...

  7. 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)

    第一眼就想到DP,然后想了N久就想不到可以不重算的DP  最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...

  8. HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)

    Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  9. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

随机推荐

  1. 如何更好地利用Pmd、Findbugs和CheckStyle分析结果

    这里列出了很多Java静态分析工具,每一种工具关注一个特定的能发挥自己特长的领域,我们可以列举一下: Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可能的bug— ...

  2. 【转】flume+kafka+zookeeper 日志收集平台的搭建

    from:https://my.oschina.net/jastme/blog/600573 flume+kafka+zookeeper 日志收集平台的搭建 收藏 jastme 发表于 10个月前 阅 ...

  3. 【转】使用Eclipse构建Maven项目 (step-by-step)

    安装eclipse 及配置maven时,参考的资料!!! from:http://blog.csdn.net/qjyong/article/details/9098213 Maven这个个项目管理和构 ...

  4. 如何删除git远程分支

    1,在开发过程中,大家在远程创建了许多分支,有些是无用的,该如何删除呢,可以参考下面的方法. 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放 稳 ...

  5. #define 中#和##的作用

    #的作用是把后面的参数变成一个字符串. 如,#define f(a) #a f(hello world)相当于"hello world": ##的作用是把两个字符串连接起来. 如, ...

  6. js改变HTML元素的值

    js改变HTML元素的值(常用,备忘) <!DOCTYPE html> <html> <body> <h1>我的第一段 JavaScript</h ...

  7. zstu.2512. Moving Tables(贪心)

     Moving Tables Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1182  Solved: 563 Description The famo ...

  8. 北美IT公司大致分档

    北美IT公司大致分档(from mitbbs.com) 第一档: Uber, Snapchat, Airbnb, Dropbox, Pinterest 第二档:Facebook, LinkedIn, ...

  9. HTML5 video 视频标签 常用属性

    最近在做手机端的 h5 页面的视频直播功能,用到了 Video 标签.其常用的属性有以下几个: src.poster.preload.autoplay.loop.controls.width.heig ...

  10. nginx的那些内置变量

    nginx在配置文件nginx.conf中可以使用很多内置变量,配置如下: location /info { add_header 'Content-Type' 'text/html'; echo & ...