当前位置:网站首页>AcWing 904. 虫洞 题解(spfa求负环)
AcWing 904. 虫洞 题解(spfa求负环)
2022-07-06 18:00:00 【乔大先生】
AcWing 904. 虫洞
负环就是图中存在的权值之和为负数的环,如果图中存在负环,则农夫一定能返回起点,反之一定不能,所以这是一个裸的求负环的题目。用spfa记录最短路上的边的数量,如果某条路径上边的数量大于等于n,则可以认定这条路上存在负环,返回true即可,反之返回false
#include<bits/stdc++.h>
using namespace std;
const int N = 520, M = 5210;
int T, n, m1, m2;
int h[N], ne[M], e[M], w[M], idx;
int st[N];
int dist[N]; //最短距离记录数组
int cnt[N]; //记录最短距离的边数
void add(int a, int b, int c){
e[idx] = b;
ne[idx] = h[a];
w[idx] = c;
h[a] = idx ++ ;
}
bool spfa(){
//判断负环
memset(dist, 0, sizeof dist);
memset(st, 0, sizeof st);
memset(cnt, 0, sizeof cnt);
queue<int>q;
for(int i = 1; i <= n; i ++ ){
q.push(i);
st[i] = true;
}
while(q.size()){
int t = q.front();
q.pop();
st[t] = false;
for(int i = h[t]; ~i; i = ne[i]){
int j = e[i];
if(dist[j] > dist[t] + w[i]){
dist[j] = dist[t] + w[i];
cnt[j] = cnt[t] + 1; //从t到j多了一条边w[t][j]
if(cnt[j] >= n) return true; //如果这个路径上的边的数量大于n,那说明存在负环,农夫一定可以回到起点
if(!st[j]){
q.push(j);
st[j] = true;
}
}
}
}
return false; //如果一直没有找到负环,说明农夫回不到起点,返回false
}
int main()
{
cin>>T;
while(T -- ){
cin>>n>>m1>>m2;
memset(h, -1, sizeof h);
idx = 0; //记住初始化
for(int i = 0; i < m1; i ++ ){
int a, b, c;
cin>>a>>b>>c;
//正常路径,相当于双向变
add(a, b, c);
add(b, a, c);
}
for(int i = 0; i < m2; i ++ ){
int a, b, c;
cin>>a>>b>>c;
add(a, b, -c); //虫洞相当于一条负权边
}
if(spfa()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
边栏推荐
- golang中的Mutex原理解析
- THREE. AxesHelper is not a constructor
- 对C语言数组的再认识
- Neon Optimization: an optimization case of log10 function
- 1123. 最深叶节点的最近公共祖先
- 子网划分、构造超网 典型题
- Using the entry level of DVA in taro3.*
- What does front-end processor mean? What is the main function? What is the difference with fortress machine?
- table表格设置圆角
- 域分析工具BloodHound的使用说明
猜你喜欢
从底层结构开始学习FPGA----FIFO IP的定制与测试
黑马笔记---异常处理
1123. 最深叶节点的最近公共祖先
字节P7专业级讲解:接口测试常用工具及测试方法,福利文
MySQL script batch queries all tables containing specified field types in the database
1123. The nearest common ancestor of the deepest leaf node
HMM notes
对C语言数组的再认识
Typical problems of subnet division and super network construction
[100 cases of JVM tuning practice] 05 - Method area tuning practice (Part 2)
随机推荐
Receive user input, height BMI, BMI detection small business entry case
Taro applet enables wxml code compression
The difference between spin and sleep
让我们,从头到尾,通透网络I/O模型
Spark TPCDS Data Gen
Lldp compatible CDP function configuration
AI 从代码中自动生成注释文档
golang 基础 —— 数据类型
免费白嫖的图床对比
2022 Google CTF SEGFAULT LABYRINTH wp
2022 Google CTF segfault Labyrinth WP
Add the applet "lazycodeloading": "requiredcomponents" in taro,
Sword finger offer II 035 Minimum time difference - quick sort plus data conversion
【芯片方案设计】脉搏血氧仪
Asset security issues or constraints on the development of the encryption industry, risk control + compliance has become the key to breaking the platform
力扣1037. 有效的回旋镖
Spark TPCDS Data Gen
Neon Optimization: summary of performance optimization experience
[JS] obtain the N days before and after the current time or the n months before and after the current time (hour, minute, second, year, month, day)
机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。