26分求调
查看原帖
26分求调
482610
Mortidesperatslav楼主2023/7/26 10:25

rt,WA。

#include<bits/stdc++.h>
using namespace std;
int h[10001], nxt[500001], val[500001], zd[500001], cnt = 0;
int n, m, s, dis[10001];
bool inq[10001];
int q[1000001], f, e;
void addedge(int a, int b, int c) {
	cnt++;
	val[cnt] = c, zd[cnt] = b, nxt[cnt] = 0;
	nxt[cnt] = h[a];
	h[a] = cnt;
}
int inqnum = 0;
int main() {
	int t;
	cin >> t;
	while (t--) {
		inqnum=0;
		memset(h,0,sizeof(h));
		memset(val,0,sizeof(val));
		memset(q,0,sizeof(q));
		memset(inq,0,sizeof(inq));
		cnt=0;
		memset(zd,0,sizeof(zd));
		memset(nxt,0,sizeof(nxt));
		cin >> n >> m;
		s = 1;
		for (register int i = 1; i <= m; i++) {
			int a, b, c;
			scanf("%d%d%d", &a, &b, &c);
			addedge(a, b, c);
			if(c>=0)addedge(b, a, c);
		}
		memset(dis, -1, sizeof(dis));
		dis[s] = 0, inq[s] = 1;
		q[1] = s, f = 1, e = 1;
		while (f <= e) {
			int u = q[f++];
			for (register int p = h[u]; p; p = nxt[p]) {
				int v = zd[p], c = val[p];
				if (dis[v] == -1 || dis[v] > dis[u] + c) {
					dis[v] = dis[u] + c;
					if (inq[v] == 0) {
						if(++inqnum>=n){
							cout<<"YES\n";
							goto l;
						}
						q[++e] = v, inq[v] = 1;
					}
				}
			}
			inq[u] = 0;
		}
		cout<<"NO\n";
		l:{}
	}
}
2023/7/26 10:25
加载中...