洛谷 P3385 【模板】负环 (SPFA)
2024-09-02 07:53:09
题意:有一个\(n\)个点的有向图,从\(1\)出发,问是否有负环.
题解:我们可以用SPFA来进行判断,在更新边的时候,同时更新路径的边数,因为假如有负环的话,SPFA这个过程一定会无限重复的遍历这个环,那么这个环中的边数也就会不断增加,因为我们只有\(n\)个点,所以假如某条路径的边数\(\ge n\)时,就说明有点重复使用了,也就说明一定存在负环.这题让我们从1开始走,所以只要对1初始化一下就行了.
代码:
struct misaka{
int out;
int val;
}e; int t;
int n,m;
int dis[N];
bool st[N];
int cnt[N];
vector<misaka> v[N]; bool spfa(){ queue<int> q; st[1]=true;
dis[1]=0;
q.push(1); while(!q.empty()){
int node=q.front();
q.pop(); st[node]=false; for(auto w:v[node]){
int now=w.out;
if(dis[now]>dis[node]+w.val){
dis[now]=dis[node]+w.val;
cnt[now]=cnt[node]+1;
if(cnt[now]>=n) return true;
if(!st[now]){
st[now]=true;
q.push(now);
}
}
}
}
return false;
} int main() {
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
dis[i]=INF;
st[i]=false;
cnt[i]=0;
}
for(int i=1;i<=m;++i){
int a,b,val;
scanf("%d %d %d",&a,&b,&val);
if(val>=0){
v[a].pb({b,val});
v[b].pb({a,val});
}
else
v[a].pb({b,val});
} if(spfa()) puts("YES");
else puts("NO");
for(int i=1;i<=n;++i){
v[i].clear();
}
} return 0;
}
最新文章
- Ubuntu菜鸟入门(二)—— apt认知,且完善语言安装包
- bootstrap ace MVC
- delphi的tserversocket控件如何接收16进制数
- Sicily-1134
- CentOS安装配置Tomcat7
- 在Unity3D中实现安卓平台的本地通知推送
- hdu 5340 (manacher)
- 18 UI美化transition 图片过渡
- 强化学习(十一) Prioritized Replay DQN
- go 闭包程序解读
- IP通信基础课堂笔记----简答题
- Django--CRM--菜单排序等
- 转载ORM--EF框架
- PAT B1045 快速排序 (25 分)
- hdu 3308 LCIS(线段树区间合并)
- VIN码/车架号的详解,车架号识别,VIN码识别,OCR车架号识别能带来什么
- 根据数据库连接的java.sql.Connection获取数据库名称
- 2.ECMAScript 5.0
- 本地方法中printf如何传给java--java系统级命名管道
- Codeforces Round #522 Div2C(思维)