1 条题解

  • 0
    @ 2024-1-3 19:21:11
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2020;
    struct Edge { int v, w; };
    vector<Edge> g[maxn];
    int T, n, m;
    
    // SPFA
    int dis[maxn], cnt[maxn];
    bool ins[maxn]; // 判断是否在队列中
    bool spfa() {
        stack<int> stk;
        memset(dis, 0x3f, sizeof(int)*(n+1));
        memset(cnt, 0, sizeof(int)*(n+1));
    	memset(ins, 0, sizeof(bool)*(n+1));
        dis[1] = 0;
        stk.push(1);
        while (!stk.empty()) {
            int u = stk.top();
            stk.pop();
            ins[u] = false;
            if (++cnt[u] > n * 10) 
            	return true;
            for (auto e : g[u]) {
                int v = e.v, w = e.w;
                if (dis[v] > dis[u] + w) {
                    dis[v] = dis[u] + w;
                    if (!ins[v])
                        ins[v] = true, stk.push(v);
                }
            }
        }
        return false;
    }
    
    int main() {
    	scanf("%d", &T);
    	while (T--) {
    		scanf("%d%d", &n, &m);
    		for (int i = 1; i <= n; i++)
    			g[i].clear();
    	    for (int i = 0; i < m; i++) {
    	        int u, v, w;
    	        scanf("%d%d%d", &u, &v, &w);
    	        g[u].push_back({v, w});
    	        if (w >= 0)
    	        	g[v].push_back({u, w});
    	    }
    	    puts(spfa() ? "YES" : "NO");
    	}
        return 0;
    }
    
    • 1

    信息

    ID
    29
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者