POJ 1364 King(差分约束)

题目链接

根据连续的和建图,然后判断是否有负环。注意细节,加上超级源点后,有n+1个点。忘了初始化了,让我WA了N次啊。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <ctime>
#include <map>
using namespace std;
#define N 1001
struct node
{
    int u,v,w,next;
}edge[N];
int first[N],d[N];
int t;
void add(int u,int v,int w)
{
    edge[t].u = u;
    edge[t].v = v;
    edge[t].w = w;
    edge[t].next = first[u];
    first[u] = t;
    t ++;
}
void CL()
{
    t = 1;
    memset(first,-1,sizeof(first));
}
int main()
{
    int n,m,x,y,w,i,flag,j;
    int u,v;
    char ch[10];
    while(scanf("%d",&n)!=EOF)
    {
        if(n == 0)
        break;
        scanf("%d",&m);
        CL();
        for(i = 1;i <= m;i ++)
        {
            scanf("%d%d%s%d",&x,&y,ch,&w);
            if(ch[0] == 'g')
            {
                add(x-1,x+y,w+1);
            }
            else
            {
                add(x+y,x-1,1-w);
            }
        }
        memset(d,0,sizeof(d));
        for(i = 1;i <= n+1;i ++)
        {
            flag = 1;
            for(j = 1;j < t;j ++)
            {
                u = edge[j].u;
                v = edge[j].v;
                if(d[v] < d[u] + edge[j].w)
                {
                    d[v] = d[u] + edge[j].w;
                    flag = 0;
                }
            }
            if(flag) break;
        }
        if(flag == 0)
        printf("successful conspiracy\n");
        else
        printf("lamentable kingdom\n");
    }
    return 0;
}

 

posted @ 2013-02-22 14:17  Naix_x  阅读(184)  评论(0编辑  收藏  举报