Haunted Graveyard ZOJ - 3391(SPFA)
从点(n,1)到点(1,m)的最短路径,可以转换地图成从(1,1)到(n,m)的最短路,因为有负权回路,所以要用spfa来判负环,
注意一下如果负环把终点包围在内的话, 如果用负环的话会输出无穷,但是有答案的,所以从终点出去的点不要,还有就是负环习惯用-1判断,但是可能会有负值,所以要用-inf
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
const int mod = 1e9+;
using namespace std; int n, m;
int T, tol;
struct Node {
int u, v, w, next;
bool operator < (Node a) const {
return w > a.w;
}
};
Node node[maxm];
int cnt[maxn];
int dis[maxn];
bool vis[maxn];
int head[maxn];
int maps[][]; void init() {
tol = ;
memset(cnt, , sizeof cnt);
memset(vis, , sizeof vis);
memset(dis, inf, sizeof dis);
memset(maps, , sizeof maps);
memset(head, -, sizeof head);
} int getnum(int i, int j) {
return (i-)*m + j;
} void addnode(int u, int v, int w) {
node[tol].u = u;
node[tol].v = v;
node[tol].w = w;
node[tol].next = head[u];
head[u] = tol++;
} int spfa(int st, int ed) {
int all = ed;
queue<int> q;
vis[st] = true;
dis[st] = ;
cnt[st]++;
q.push(st);
while(!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;
if(u==ed)
continue;
for(int i=head[u]; ~i; i=node[i].next) {
int v = node[i].v;
int w = node[i].w;
if(dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if(!vis[v]) {
vis[v] = true;
cnt[v]++;
if(cnt[v] >= all) return -inf;
q.push(v);
}
}
}
}
return dis[ed];
} int main() {
while(scanf("%d%d", &m, &n), n||m) {
init();
int q;
scanf("%d", &q);
int x, y;
while(q--) {
scanf("%d%d", &x, &y);
x++, y++;
maps[y][x] = ;
}
scanf("%d", &q);
int x2, y2, t;
while(q--) {
scanf("%d%d%d%d%d", &x, &y, &x2, &y2, &t);
x++, y++;
x2++, y2++;
maps[y][x] = ; addnode(getnum(y, x), getnum(y2, x2), t);
}
// for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) printf("%d%c", maps[i][j], j==m ? '\n' : ' ');
for(int i=; i<=n; i++) {
for(int j=; j<=m; j++) {
if(i == n && j == m) continue;
if(maps[i][j] == ) {
if(i- >= && maps[i-][j] != )
addnode(getnum(i, j), getnum(i-, j), );
if(j- >= && maps[i][j-] != )
addnode(getnum(i, j), getnum(i, j-), );
if(i+ <= n && maps[i+][j] != )
addnode(getnum(i, j), getnum(i+, j), );
if(j+ <= m && maps[i][j+] != )
addnode(getnum(i, j), getnum(i, j+), );
} }
}
int ans = spfa(getnum(, ), getnum(n, m));
if(ans == -inf) printf("Never\n");
else if(ans == inf) printf("Impossible\n");
else printf("%d\n", ans);
}
return ;
}
Haunted Graveyard ZOJ - 3391(SPFA)的更多相关文章
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- 最短路(SPFA)
SPFA是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将 ...
- Bellman-Ford算法及其队列优化(SPFA)
一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...
- I - Beautiful People ZOJ - 2319 (二分法)
The most prestigious sports club in one city has exactly N members. Each of its members is strong an ...
- sgu 240 Runaway (spfa)
题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...
- codevs 1021 玛丽卡(spfa)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- 【POJ】1062 昂贵的聘礼(spfa)
http://poj.org/problem?id=1062 此题一开始果断想到暴力.. 但是n<=100果断不行. 一看题解,噗!最短路... 构图很巧妙. 每一个物品对应的所需物品相当于一个 ...
- POJ1860Currency Exchange(SPFA)
http://poj.org/problem?id=1860 题意: 题目中主要是说存在货币兑换点,然后现在手里有一种货币,要各种换来换去,最后再换回去的时候看能不能使原本的钱数增多,每一种货币都有 ...
- 【NOIP 2013 DAY2 T3】 华容道(spfa)
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
随机推荐
- StackWalk64
#include <Windows.h> #define PULONG_PTR ULONG** #define PULONG ULONG* #define ULONG_PTR U ...
- Docker安装部署redis
借鉴博客:https://my.oschina.net/u/3489495/blog/1825335 待续... >>>>>>>>>docker安 ...
- jenkins配置SSH远程服务器连接
之前用jenkins做了一个自动发布测试,配置任务的Post Steps时,选择的是执行shell命令.如下图: 这是在本192.168.26.233服务器上测试的,此服务器上运行jenkins,to ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
- 为什么js中要用void 0 代替undefined
这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...
- python之路--内置函数03
一 . 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n \t \b 单词的边界 \W 非xxx \D \S [ ] 字符组 or的关系 [^ ...
- 引入kaptcha实现验证码验证
1.导入jar包, 可以选择去 https://mvnrepository.com 里面搜索,也可以直接复制下面的代码 2.复制到maven配置文件pom.xml中并保存 <dependency ...
- AdminLTE 前端框架
适合运维平台 后台管理系统 AdminLTE 是一个开源的后台控制面板和仪表盘 WebApp 模板. 这是一个快速的HTML模板,基于CSS框架的引导. 文档: http://adminlte.la ...
- PHP爬虫框架Snoopy的使用
参考文档: http://ibillxia.github.io/blog/2010/08/10/php-connecting-tool-snoopy-introduction-and-applicat ...
- 各个版本spring的jar包以及源码下载地址,目前最高版本到spring4.3.8,留存备用:
http://maven.springframework.org/release/org/springframework/spring/