社区讨论

负环SPFA 为什么第一个点入队时加不加cnt[1]=1都能AC

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m3x064w8
此快照首次捕获于
2024/11/25 20:27
去年
此快照最后确认于
2025/11/04 13:55
4 个月前
查看原帖
P3385 【模板】负环 就是注释了---------------的那一行
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 条回复,欢迎继续交流。

正在加载回复...