POJ3259-负权回路判定

题目:http://vj.acmclub.cn/contest/view.action?cid=316#problem/E

 

首先要理解题意:其实就是给你一个图让你判断有没有负权回路

 

因此直接用BallmenFord算法就可以了

 

特别注意一些问题:path是双向的因此要写两遍

 

代码:

# include<iostream>
//# include<queue>
# include<cstring>

using namespace std;

const int INF = 99999999;
const int MAXN = 5500;
int u[MAXN], v[MAXN], w[MAXN];

int N, M, W, k;

int dis[550];


bool bellman_ford()
{
    bool check = 0;

    memset(dis, INF, sizeof(dis));
    dis[1] = 0;

    for (int i = 0; i < N - 1; i++)
    {
        check = 1;

        for (int j = 1; j < k; j++)
        {
            if (dis[u[j]]<INF&& dis[v[j]] > dis[u[j]] + w[j])
            {
                check = 0;
                dis[v[j]] = dis[u[j]] + w[j];
            }
        }

        if (check)
            return false;
    }

    for (int i = 1; i <k; i++)
        if (dis[u[i]]<INF&&dis[v[i]] > dis[u[i]] + w[i])
            return true;
    return false;
}

int main()
{
    int F, s, e, t;
    cin >> F;
    while (F--)
    {
        k = 1;
        cin >> N >> M >> W;

        for (int i = 1; i <= M; i++)
        {
            cin >> s >> e >> t;
            u[k] = s;
            v[k] = e;
            w[k] = t;
            k++;
            u[k] = e;
            v[k] = s;
            w[k] = t;
            k++;
        }

        for (int i = 1; i <= W; i++)
        {
            cin >> s >> e >> t;
            u[k] = s;
            v[k] = e;
            w[k] = -t;
            k++;

        }

        if (bellman_ford())
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }

    //system("pause");

    return 0;
}

本来是想用一下SPFA的,尝试了一下队列+vector的操作,结果WA了

对vector的用法可能还不不是太熟悉,另外SPFA也没太理解,尤其是用SPFA判断负权回路很麻烦

待我再研究

posted @ 2016-03-09 14:58  DigitalHermit  阅读(383)  评论(0编辑  收藏  举报