从点(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)的更多相关文章

  1. 模板C++ 03图论算法 1最短路之单源最短路(SPFA)

    3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...

  2. 最短路(SPFA)

    SPFA是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将 ...

  3. Bellman-Ford算法及其队列优化(SPFA)

    一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...

  4. I - Beautiful People ZOJ - 2319 (二分法)

    The most prestigious sports club in one city has exactly N members. Each of its members is strong an ...

  5. sgu 240 Runaway (spfa)

    题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...

  6. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  7. 【POJ】1062 昂贵的聘礼(spfa)

    http://poj.org/problem?id=1062 此题一开始果断想到暴力.. 但是n<=100果断不行. 一看题解,噗!最短路... 构图很巧妙. 每一个物品对应的所需物品相当于一个 ...

  8. POJ1860Currency Exchange(SPFA)

    http://poj.org/problem?id=1860 题意:  题目中主要是说存在货币兑换点,然后现在手里有一种货币,要各种换来换去,最后再换回去的时候看能不能使原本的钱数增多,每一种货币都有 ...

  9. 【NOIP 2013 DAY2 T3】 华容道(spfa)

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

随机推荐

  1. PHP中多个文件包含的问题 (一)

    使用require或者include来包含文件时,包含的文件的内容相对性,这个很容易搞混,所以记录一下. 这个相对性包括 __DIR__,__FILE__,$_SERVER['PHP_SELF'],$ ...

  2. python文件封装成*.exe文件(单文件和多文件)

    环境:win10 64位  python3.7 单*.py文件打包Python GUI:程序打包为exe 一.安装Pyinstaller,命令pip install Pyinstaller,(大写的P ...

  3. python3 九九乘法表打印花式操作(然并卵)

    # 九九乘法表# 方法一# for i in range(1, 10):# for j in range(1, i+1):# print('{}x{}={}\t'.format(i, j, i*j), ...

  4. Java Hash集合的equals()与hashCode() 方法

    Java 集合实现类,无论是HashSet.HashMap等所有的Hash算法实现的集合类(后面简称Hash集合),加入的对象必须实现 hashCode() 与 equals() 方法,稍微不同的地方 ...

  5. [转帖]学习关于TTL

    自己简单试了一下在家里与在公司里面服务器的连接: C:\Users\Administrator>tracert oms.inspur.com 通过最多 个跃点跟踪 到 oms.inspur.co ...

  6. laravel实现批量添加数据

    在使用laravel eloquent进行数据库操作的时候惊讶的发现这货居然不支持批量添加,看到网上很多人在循环里进行数据库插入操作来实现批量添加,我想说这样做是很损失性能滴!好在框架的DB门面里的i ...

  7. JavaScript charAt() 方法

    <script> var str="abcdef"; alert(str[0]); //a,高版本浏览器兼容 alert(str.charAt(0)); //a,兼容所 ...

  8. spring boot+mybatis+generator生成domain大小写问题

    之前遇到一个问题,用generator生成数据库对应的domain,以前都是好好的,那天突然生成的domain都是小写的,因为我数据库里是大写的,后来找到解决办法, <table tableNa ...

  9. Django--CRM--modelformset的用法

    一 . modelformset用法 其实和modelform方法差不多,只不过是显示的时候可以直接修改,显示的select的那种模式 from django.forms import modelfo ...

  10. jenkins中通过execute shell启动的进程会被杀死的问题

    在jenkins中配置自动更新部署项目时,如果采取用execute shell启动/关闭tomcat,会发现可以进行关闭tomcat, 但是无法启动tomcat,虽然构建会显示执行成功,但是查看进程, ...