当前位置:网站首页>AcWing 904. Wormhole solution (SPFA for negative rings)
AcWing 904. Wormhole solution (SPFA for negative rings)
2022-07-07 01:36:00 【Mr. Qiao Da】
AcWing 904. Wormhole
A negative ring is a ring in which the sum of the weights in the graph is negative , If there is a negative ring in the graph , Then the farmer must be able to return to the starting point , On the contrary, it must not , So this is a naked problem of finding negative rings . use spfa Record the number of edges on the shortest path , If the number of edges on a path is greater than or equal to n, Then it can be determined that there is a negative ring on this road , return true that will do , Instead, return to 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]; // Shortest distance record array
int cnt[N]; // Record the number of sides of the shortest distance
void add(int a, int b, int c){
e[idx] = b;
ne[idx] = h[a];
w[idx] = c;
h[a] = idx ++ ;
}
bool spfa(){
// Judge negative loop
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; // from t To j One more side w[t][j]
if(cnt[j] >= n) return true; // If the number of edges on this path is greater than n, That means there is a negative ring , The farmer must be able to return to the starting point
if(!st[j]){
q.push(j);
st[j] = true;
}
}
}
}
return false; // If you haven't found a negative ring , It means that the farmer cannot return to the starting point , return false
}
int main()
{
cin>>T;
while(T -- ){
cin>>n>>m1>>m2;
memset(h, -1, sizeof h);
idx = 0; // Remember to initialize
for(int i = 0; i < m1; i ++ ){
int a, b, c;
cin>>a>>b>>c;
// Normal path , Equivalent to Bidirectional Transformation
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); // Wormhole is equivalent to a negative weight edge
}
if(spfa()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
边栏推荐
- ClickHouse字段分组聚合、按照任意时间段粒度查询SQL
- Clickhouse fields are grouped and aggregated, and SQL is queried according to the granularity of any time period
- Transformation transformation operator
- Dark horse notes - exception handling
- HMM notes
- AcWing 344. 观光之旅题解(floyd求无向图的最小环问题)
- 安全保护能力是什么意思?等保不同级别保护能力分别是怎样?
- grep查找进程时,忽略grep进程本身
- Send template message via wechat official account
- 7.6模拟赛总结
猜你喜欢
LeetCode:1175. 质数排列
[advanced C language] 8 written questions of pointer
Body mass index program, entry to write dead applet project
Dark horse notes - exception handling
MySQL script batch queries all tables containing specified field types in the database
盒子拉伸拉扯(左右模式)
HMM notes
设置Wordpress伪静态连接(无宝塔)
Send template message via wechat official account
Yunna | work order management measures, how to carry out work order management
随机推荐
前置机是什么意思?主要作用是什么?与堡垒机有什么区别?
Long press the button to execute the function
7.6模拟赛总结
Drag to change order
C language instance_ four
2022 Google CTF segfault Labyrinth WP
Right mouse button customization
盒子拉伸拉扯(左右模式)
How to prevent overfitting in cross validation
2022 Google CTF SEGFAULT LABYRINTH wp
uva 1401 dp+Trie
Add the applet "lazycodeloading": "requiredcomponents" in taro,
1123. 最深叶节点的最近公共祖先
鼠标右键 自定义
一起看看matlab工具箱内部是如何实现BP神经网络的
云呐-工单管理制度及流程,工单管理规范
LeetCode:1175. Prime permutation
修改px4飞控的系统时间
THREE.AxesHelper is not a constructor
2022 Google CTF SEGFAULT LABYRINTH wp