当前位置:网站首页>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;
}
边栏推荐
- Sword finger offer II 035 Minimum time difference - quick sort plus data conversion
- 子网划分、构造超网 典型题
- THREE. AxesHelper is not a constructor
- JTAG principle of arm bare board debugging
- 移植DAC芯片MCP4725驱动到NUC980
- Typical problems of subnet division and super network construction
- 剑指 Offer II 035. 最小时间差-快速排序加数据转换
- Asset security issues or constraints on the development of the encryption industry, risk control + compliance has become the key to breaking the platform
- NEON优化:矩阵转置的指令优化案例
- 接收用户输入,身高BMI体重指数检测小业务入门案例
猜你喜欢
LeetCode:1175. 质数排列
[case sharing] basic function configuration of network loop detection
HMM 笔记
Transformation transformation operator
Wood extraction in Halcon
Clickhouse fields are grouped and aggregated, and SQL is queried according to the granularity of any time period
1123. 最深叶节点的最近公共祖先
【案例分享】网络环路检测基本功能配置
Make Jar, Not War
黑马笔记---创建不可变集合与Stream流
随机推荐
Start from the bottom structure to learn the customization and testing of fpga---- FIFO IP
云呐|工单管理软件,工单管理软件APP
[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)
从底层结构开始学习FPGA----FIFO IP的定制与测试
Install Firefox browser on raspberry pie /arm device
从零开始匹配vim(0)——vimscript 简介
【案例分享】网络环路检测基本功能配置
1123. The nearest common ancestor of the deepest leaf node
Machine learning: the difference between random gradient descent (SGD) and gradient descent (GD) and code implementation.
The MySQL database in Alibaba cloud was attacked, and finally the data was found
Taro中添加小程序 “lazyCodeLoading“: “requiredComponents“,
What are the differences between Oracle Linux and CentOS?
Atomic in golang and CAS operations
负载均衡性能参数如何测评?
golang中的atomic,以及CAS操作
golang 基础 —— 数据类型
How to prevent overfitting in cross validation
子网划分、构造超网 典型题
What does front-end processor mean? What is the main function? What is the difference with fortress machine?
微信公众号发送模板消息