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 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
随机推荐
- 解决ImportError: cannot import name 'webdriver' from 'selenium' (C:\Users\Mr.Su\PycharmProjects\***\venv\selenium.py)
报错信息如下图所示: 解决方案:将项目根目录下的自己创建的selenium.py文件重命名.
- Win1064位下mysql插入百万行数据耗时问题
performance - Inserting 1 Million records is taking too much time MYSQL - Stack Overflowhttps://stac ...
- MySQL 性能调优之索引
原文:http://bbs.landingbj.com/t-0-245452-1.html 对于索引的优化,我们第一需要找到合适的字段,第二创建索引找到合适的顺序,第三要找到合适的比例,第四是要做合适 ...
- [转帖]web安全:QQ号快速登录漏洞及被盗原理
web安全:QQ号快速登录漏洞及被盗原理 https://www.cnblogs.com/1996V/p/7481823.html 看了下 QQ的确监听 端口 大神牛B 自己这一块一直没深入学习过.. ...
- Eclipse打开java文件繁体字
右键-->properties-->Resource-->Text file encoding, 改成utf-8 .
- python爬虫之git的团队协作
一.Git实践: commit,push,pull,status,add基本是最常用的几个命令. 1.首先我在github上创建了一个项目,然后我在本地的文件建立了一个普通的目录(git_data). ...
- 搞了一下午时间全浪费在这了,其实是自己拷贝了patch文件,导致tab变成了空格的错
很老实的基于最新的kernel,源文件,修改了代码.通过diff -uNr --show-c-function dir1 dir2 > ipv6.patch制作了patch文件,准备代码上库构建 ...
- JQ 动态修改/替换某个节点的内容
<div class="box">我们定位于中国心理行业第一<div> $(".box").html($(".box&quo ...
- js正則表達式
正則表達式實例化的兩種方式: 字符型 var a=// 對象型var a=new RegExp(,) 修飾符: i:忽略大小寫 g:全局搜索 m:多行搜索 元字符: \轉義字符 \w:字符,數字,下劃 ...
- Windows上安装 TensorFlow及简单命令
1.官网及帮助文档 官网: https://www.tensorflow.org/install/install_windows 中文帮助文档:https://efeiefei.gitbooks.io ...