洛谷 P2136 拉近距离 题解
P2136 拉近距离
题目背景
我是源点,你是终点。我们之间有负权环。 ——小明
题目描述
在小明和小红的生活中,有N个关键的节点。有M个事件,记为一个三元组(Si,Ti,Wi),表示从节点Si有一个事件可以转移到Ti,事件的效果就是使他们之间的距离减少Wi。
这些节点构成了一个网络,其中节点1和N是特殊的,节点1代表小明,节点N代表小红,其他代表进展的阶段。所有事件可以自由选择是否进行,但每次只能进行当前节点邻接的。请你帮他们写一个程序,计算出他们之间可能的最短距离。
输入格式
第1行,两个正整数N,M.
之后M行,每行3个空格隔开的整数Si,Ti,Wi。
输出格式
一行,一个整数表示他们之间可能的最短距离。如果这个距离可以无限缩小,输出“Forever love”(不含引号)。
输入输出样例
输入 #1
3 3
1 2 3
2 3 -1
3 1 -10
输出 #1
-2
说明/提示
对于20%数据,N<=10,M<=50。
对于50%数据,N<=300,M<=5000。
对于全部数据,N<=1000,M<=10000,|Wi|<=100,保证从节点1到N有路径。
【思路】
学了SPFA判负环之后做的第一道
用SPFA来判断负环的题目
SPFA判负环详见这篇博客
这里
【题目分析】
两个人之间能够到达并且缩短的距离最大化
这不就成了最长路了吗?
完全可以将数前面加个负号变为相反数
这样就可以跑最短路了
负环怎么判断?
当然是SPFA
【不完整思路】
知道了上面两点就很好办了
插入的时候转化为相反数
然后构建邻接矩阵
从1开始跑SPFA
如果有负环那就返回输出Forever love然后结束程序
不然那就输出1到n的最短距离
然后发现只有90分
是什么情况呢?
【最终思路】
这是单向路
所以不只有1能够向n跑,n也可以向1跑
所以两边SPFA
一遍 从1开始,
一遍 从n开始,
比较1到n和n到1这两条路那一条更短就输出
注意一下只要这两个方向有一个能够出现负环
那就输出Forever love
因为负环就是最短的体现
【完整代码】
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define int long long
using namespace std;
const int Max = 10004;
const int M = 1002;
struct node
{
int y,ne,z;
}a[Max];
int sum = 0;
int n,m;
int head[M];
void add(int x,int y,int z)
{
a[++ sum].y = y;
a[sum].ne = head[x];
a[sum].z = z;
head[x] = sum;
}
int use[M],d[M],cnt[M];
bool SPFA(int acioi)
{
queue<int>q;
for(register int i = 1;i <= n;++ i)
d[i] = 99999999;
d[acioi] = 0;
q.push(acioi);
while(!q.empty())
{
int x = q.front();
q.pop();use[x] = false;
for(register int i = head[x];i != 0;i = a[i].ne)
{
int y = a[i].y;
if(d[y] > d[x] + a[i].z)
{
d[y] = d[x] + a[i].z;
cnt[y] = cnt[x] + 1;
if(cnt[y] > n)
return false;
if(use[y] == false)
{
use[y] = true;
q.push(y);
}
}
}
}
return true;
}
signed main()
{
scanf("%lld%lld",&n,&m);
int s,t,w;
for(register int i = 1;i <= m;++ i)
{
scanf("%lld%lld%lld",&s,&t,&w);
add(s,t,-w);
}
int MM;
if(SPFA(1) == false)
{
cout << "Forever love" << endl;
return 0;
}
MM = d[n];
memset(use,false,sizeof(use));
memset(cnt,0,sizeof(cnt));
if(SPFA(n) == false)
{
cout << "Forever love" << endl;
return 0;
}
cout << min(MM,d[1]) << endl;
return 0;
}
洛谷 P2136 拉近距离 题解的更多相关文章
- 洛谷P2136 拉近距离
题目背景 我是源点,你是终点.我们之间有负权环. --小明 题目描述 在小明和小红的生活中,有\(N\)个关键的节点.有\(M\)个事件,记为一个三元组\((S_i,T_i,W_i)\),表示从节点\ ...
- P2136 拉近距离(spfa判负环)
洛谷—— P2136 拉近距离 题目背景 我是源点,你是终点.我们之间有负权环. ——小明 题目描述 在小明和小红的生活中,有N个关键的节点.有M个事件,记为一个三元组(Si,Ti,Wi),表示从节点 ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
随机推荐
- 关键字ref、out
通常,变量作为参数进行传递时,不论在方法内进行了什么操作,其原始初始化的值都不会被影响: 例如: public void TestFun1() { ; TestFun2(arg); Console.W ...
- MongoDB和Java(3):Java操作MongoB
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- 2019 鹏博士java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.鹏博士等公司offer,岗位是Java后端开发,因为发展原因最终选择去了鹏博士,入职一年时间了,之前面试了很多 ...
- P2472 [SCOI2007]蜥蜴 (最大流)
题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...
- Java自学-数组 二维数组
Java 如何使用二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维 ...
- 换个语言学一下 Golang (9)——结构体和接口
基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...
- Git下载安装及设置详细教程
Git下载安装及设置详细教程 一.安装前准备 1. 廖雪峰老师Git教程 :推荐Git入门教程. 2. 按照自己的系统版本下载Git软件,我的操作系统:Windows7 64位,安装版本为Git ...
- Matlab责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦,本人根据https://www.ru ...
- react学习记录(一)
一.React是什么 声明式写法(强调结果,命令式编程强调过程) 组件化 一次学习,随处编写(多种应用场景,web程序,原生手机应用,系统应用,命令行工具) 二.为什么学习react 大公司加持-fa ...
- MySQL高可用架构应该考虑什么? 你认为应该如何设计?
一.MySQL高可用架构应该考虑什么? 对业务的了解,需要考虑业务对数据库一致性要求的敏感程度,切换过程中是否有事务会丢失 对于基础设施的了解,需要了解基础设施的高可用的架构.例如 单网线,单电源等情 ...