社区讨论
负环SPFA 为什么第一个点入队时加不加cnt[1]=1都能AC
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m3x08ey9
- 此快照首次捕获于
- 2024/11/25 20:28 去年
- 此快照最后确认于
- 2025/11/04 13:55 4 个月前
【模板】负环
就是注释了---------------的那一行
CPP#include<bits/stdc++.h> //TLE,这题卡SPFA
using namespace std;
typedef long long ll;
struct edge{
int v;
ll w;
edge(int vv,ll ww) {
v = vv;
w = ww;
return;
}
};
int n,m,ttt;
vector<edge> g[100010];
queue<int> q;
ll dis[100010],cnt[100010];
bool vis[100010];
void SPFA() {
memset(cnt,0,sizeof(cnt));//
memset(vis,false,sizeof(vis));//
while (!q.empty()) q.pop();//
memset(dis,0x3f,sizeof(dis));
dis[1] = 0;
vis[1] = true;
cnt[1] = 1;//-----------------------------------------------------------------------------------------------------------------
q.push(1);
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;//
for (int i = 0;i < g[u].size();i ++) {
int v = g[u][i].v;
ll w = g[u][i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (!vis[v]) {
if ((++cnt[v]) >= n) {//
printf("YES\n");
return;
}
vis[v] = true;
q.push(v);
}
}
}
}
printf("NO\n");
return;
}
int main() {
scanf("%d",&ttt);
while (ttt--) {
for (int i = 1;i <= n;i ++) g[i].clear();//
scanf("%d%d",&n,&m);
for (int i = 1;i <= m;i ++) {
int ut,vt;
ll wt;
scanf("%d%d%lld",&ut,&vt,&wt);
g[ut].push_back(edge(vt,wt));
if (wt >= 0) g[vt].push_back(edge(ut,wt));
}
SPFA();
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...