2013-team5/SPP

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

const int N = 550;
const int M = 3000<<1;

int Case, n, m, w;
int tot, h[N], nxt[M], c[M], v[M];
int used[N], dis[N];
bool visit[N];

void add(int s, int t, int e) {
    v[tot] = t; c[tot] = e;
    nxt[tot] = h[s]; h[s] = tot++;
}

bool spfa(int s) {
    int u;
    queue <int> q; while(!q.empty())  q.pop();
    memset(visit, false, sizeof(visit));
    memset(used, 0, sizeof(used));
    for(int i = 1; i <= n; i++)  dis[i] = 0x1fffffff; dis[0] = 0;
    used[0] = 1;
    q.push(s);
    while(!q.empty()) {
        u = q.front(); q.pop();
        visit[u] = false;
        for(int p = h[u]; p != -1; p = nxt[p]) {
            if(dis[v[p]] > dis[u] + c[p]) {
                dis[v[p]] = dis[u] + c[p];
                if(!visit[v[p]]) {
                    visit[v[p]] = true;
                    q.push(v[p]);
                    used[v[p]]++;
                    if(used[v[p]] >= n)  return  true;
                }
            }
        }
    }
    return  false;
}

int main() {
    int s, t, e;
    scanf("%d", &Case);
    while(Case--) {
        scanf("%d%d%d", &n, &m, &w);
        memset(h, -1, sizeof(h)); tot = 0;
        for(int i = 0; i < m; i++) {
            scanf("%d%d%d", &s, &t, &e);
            add(s, t, e);
            add(t, s, e);
        }
        for(int i = 0; i < w; i++) {
            scanf("%d%d%d", &s, &t, &e);
            add(s, t, -e);
        }
        for(int i = 1; i <= n; i++)  add(0, i, 0);
        if(spfa(0))  printf("YES\n");
        else  printf("NO\n");
    }
    return  0;
}
}}}
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int N = 550;
const int M = 3000<<1;
int Case, n, m, w;
int tot, h[N], nxt[M], c[M], v[M];
int used[N], dis[N];
bool visit[N];
void add(int s, int t, int e) {
    v[tot] = t; c[tot] = e;
    nxt[tot] = h[s]; h[s] = tot++;
}
bool spfa(int s) {
    int u;
    queue <int> q; while(!q.empty())  q.pop();
    memset(visit, false, sizeof(visit));
    memset(used, 0, sizeof(used));
    for(int i = 1; i <= n; i++)  dis[i] = 0x1fffffff; dis[0] = 0;
    used[0] = 1;
    q.push(s);
    while(!q.empty()) {
        u = q.front(); q.pop();
        visit[u] = false;
        for(int p = h[u]; p != -1; p = nxt[p]) {
            if(dis[v[p]] > dis[u] + c[p]) {
                dis[v[p]] = dis[u] + c[p];
                if(!visit[v[p]]) {
                    visit[v[p]] = true;
                    q.push(v[p]);
                    used[v[p]]++;
                    if(used[v[p]] >= n)  return  true;
                }
            }
        }
    }
    return  false;
}
int main() {
    int s, t, e;
    scanf("%d", &Case);
    while(Case--) {
        scanf("%d%d%d", &n, &m, &w);
        memset(h, -1, sizeof(h)); tot = 0;
        for(int i = 0; i < m; i++) {
            scanf("%d%d%d", &s, &t, &e);
            add(s, t, e);
            add(t, s, e);
        }
        for(int i = 0; i < w; i++) {
            scanf("%d%d%d", &s, &t, &e);
            add(s, t, -e);
        }
        for(int i = 1; i <= n; i++)  add(0, i, 0);
        if(spfa(0))  printf("YES\n");
        else  printf("NO\n");
    }
    return  0;
}