求助,92pts SPFA WA on #9
查看原帖
求助,92pts SPFA WA on #9
40708
DarkBug楼主2023/10/20 00:07
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;

struct Edge{
	int v, w, next;
}edge[MAXN];

int tot, head[MAXN], n, m, s;

void AddEdge(int u, int v, int w) {

	edge[tot].v = v;
	edge[tot].w = w;
	edge[tot].next = head[u];
	head[u] = tot++;
}


int dis[MAXN], vt[MAXN], ans = 0;
bool vis[MAXN];

queue<int> q;

void init(){
	memset(head, -1, sizeof(head));
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	memset(vt, 0, sizeof(vt));
	tot = 0;
	for (int i = 0; i < n; i++) {
		edge[i].next= 0;
	}
}

void spfa(int s){
	

	dis[s] = 0;
	vis[s] = 1;
	q.push(s);
	int last = 0;
	while(!q.empty()){
		int pnum = q.front();
		q.pop();
		vis[pnum] = 0;
		for (int i = head[pnum]; i != -1; i = edge[i].next) {
			int pnext = edge[i].v, pndis = edge[i].w;
			if(pnext == last)continue;
			if (dis[pnum] + pndis < dis[pnext]){
				dis[pnext] = dis[pnum] + pndis;
				vt[pnext] = vt[pnum] + 1;
				if(vt[pnext] >= n){
					ans = 1;
					return;
				}
				if(vis[pnext] == 0){
					vis[pnext] = 1;
					q.push(pnext);
				}
			}
		}
		last = pnum;
	}

}

void solve(){
	init();

	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		AddEdge(u, v, w);
		if (w >= 0){
			AddEdge(v, u, w);
		}
		
	}

	ans = 0;
	spfa(1);

	if(ans)cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}

int main() {
	int t;cin >> t;
	while(t--){
		solve();
	}
}
2023/10/20 00:07
加载中...