POJ

来源:互联网 发布:w 是什么矩阵 编辑:程序博客网 时间:2024/06/10 20:43
#include <iostream>#include <string.h>#include <queue>#include <cstdio>#include <vector>#define INF 0x3f3f3f3fusing namespace std;struct Edge{    int from, to, dist;    Edge(int u, int v, int d): from(u), to(v), dist(d) {}};vector<Edge> edges;vector<int> G[501];bool SPFA(int n){    queue<int> Q;    int d[501];    memset(d, 0x3f, sizeof(d));    d[1] = 0;    bool v[501];    int cnt[501];    memset(cnt, 0, sizeof(cnt));    memset(v, 0, sizeof(v));    v[1] = true;    Q.push(1);    while (!Q.empty())    {        int temp = Q.front();        Q.pop();        v[temp] = false;        for (int k = 0; k < G[temp].size(); k++)        {            Edge& e = edges[G[temp][k]];            if (d[temp] < INF && d[e.to] > d[temp] + e.dist)            {                d[e.to] = d[temp] + e.dist;                if (!v[e.to])                {                    Q.push(e.to);                    v[e.to] = true;                    if (++cnt[e.to] > n)                        return false;                }            }        }    }    return true;}int main(){    freopen("aa.txt", "r", stdin);    int F, n, m, w; //fields path wormhole    scanf("%d", &F);    int a, b, t;    while (F--)    {        edges.clear();        for (int i = 0; i < 501; i++)            G[i].clear();        cin >> n >> m >> w;        while (m--)        {            scanf("%d %d %d", &a, &b, &t);            //cin >> a >> b >> t;            edges.push_back(Edge(a, b, t));            int k = edges.size();            G[a].push_back(k - 1);            edges.push_back(Edge(b, a, t));            k = edges.size();            G[b].push_back(k - 1);        }        while (w--)        {            scanf("%d %d %d", &a, &b, &t);            //cin >> a >> b >> t;            edges.push_back(Edge(a, b, -t));            int k = edges.size();            G[a].push_back(k - 1);        }        if (!SPFA(n))            printf("YES\n");        else            printf("NO\n");            //cout << "NO" << endl;    }}

2 0
原创粉丝点击