POJ 3259 Wormholes——spfa判负环

来源:互联网 发布:javascript 创建元素 编辑:程序博客网 时间:2024/06/10 19:09

注意不要把正边覆盖!

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>#include <utility>using namespace std;typedef pair<int, int> P;const int INF = 0x3f3f3f3f;const int maxn = 505;int T, N, M, W, dis[maxn], vis[maxn], num[maxn];vector<P> G[maxn];bool spfa() {    for (int i = 1; i <= N; i++) dis[i] = INF, vis[i] = 0, num[i] = 0;    dis[1] = 0, vis[1] = 1, num[1] = 1;    queue<int> q; q.push(1);    while (!q.empty()) {        int u = q.front(); q.pop();        vis[u] = 0;        for (int i = 0; i < G[u].size(); i++) {            int v = G[u][i].first, val = G[u][i].second;            if (dis[v] > dis[u] + val) {                dis[v] = dis[u] + val;                if (!vis[v]) {                    vis[v] = 1;                    q.push(v);                    num[v]++;                    if (num[v] > N) return true;                }            }        }    }    return false;}int main() {    scanf("%d", &T);    while (T--) {        scanf("%d %d %d", &N, &M, &W);        for (int i = 1; i <= N; i++) G[i].clear();        for (int i = 1; i <= M; i++) {            int u, v, cost; scanf("%d %d %d", &u, &v, &cost);            G[u].push_back(make_pair(v, cost));            G[v].push_back(make_pair(u, cost));        }        for (int i = 1; i <= W; i++) {            int u, v, val; scanf("%d %d %d", &u, &v, &val);            G[u].push_back(make_pair(v, -val));        }        if (spfa()) printf("YES\n");        else printf("NO\n");    }}


原创粉丝点击