zoj 2770 Burn the Linked Camp

今天刚刚学差分约束系统。利用最短路求解不等式。世界真的好奇妙!感觉不等式漏下几个会导致WA!!

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

const int maxn = 1111;
vector<int>ljb[maxn];//邻接表
int jz[maxn][maxn];//邻接矩阵
int n, m, shibai;
int c[maxn], d[maxn];
int dist[maxn];
int flag[maxn], tott[maxn];

void spfa()
{
    int ii;
    queue<int>Q;
    memset(flag, 0, sizeof(flag));
    memset(tott, 0, sizeof(tott));
    flag[n] = 1; tott[n]++;
    for (ii = 0; ii <= n; ii++) dist[ii] = 999999999;
    dist[n] = 0; Q.push(n);
    while (!Q.empty())
    {
        int hh = Q.front(); Q.pop(); flag[hh] = 0;
        for (ii = 0; ii < ljb[hh].size(); ii++)
        {
            if (jz[hh][ljb[hh][ii]] != 999999999)
            {
                if (dist[hh] + jz[hh][ljb[hh][ii]] < dist[ljb[hh][ii]])
                {
                    dist[ljb[hh][ii]] = dist[hh] + jz[hh][ljb[hh][ii]];
                    if (flag[ljb[hh][ii]] == 0)
                    {
                        Q.push(ljb[hh][ii]);
                        flag[ljb[hh][ii]] = 1;
                        tott[ljb[hh][ii]]++;
                        if (tott[ljb[hh][ii]] >= n)    { shibai = 1; break; }
                    }
                }
            }
        }
        if (shibai) break;
    }
}

int main()
{
    int i, j, u, v, k;
    while (~scanf("%d%d", &n, &m))
    {
        shibai = 0; c[0] = 0; d[0] = 0;
        for (i = 0; i <= n; i++) ljb[i].clear();
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j <= n; j++)
            {
                if (i == j) jz[i][j] = 0;
                else jz[i][j] = 999999999;
            }
        }
        for (i = 1; i <= n; i++) scanf("%d", &c[i]);
        for (i = 1; i <= n; i++) d[i] = c[i] + d[i - 1];
        for (i = 0; i < m; i++)
        {
            scanf("%d%d%d", &v, &u, &k);
            jz[u][v - 1] = -k;
            ljb[u].push_back(v - 1);
            jz[v - 1][u] = d[u] - d[v - 1];
            ljb[v - 1].push_back(u);
        }
        for (i = 1; i <= n; i++)
        {
            jz[i - 1][i] = c[i];
            ljb[i - 1].push_back(i);
            jz[i][i - 1] = 0;
            ljb[i].push_back(i - 1);
        }
        spfa();
        if (shibai == 1) printf("Bad Estimations\n");
        else printf("%d\n", -dist[0]);
    }
    return 0;
}

 

posted @ 2015-05-20 21:49  Fighting_Heart  阅读(186)  评论(0编辑  收藏  举报