poj 1364—— King(差分约束,spfa)

来源:互联网 发布:excel两列相同数据筛选 编辑:程序博客网 时间:2024/04/29 19:20
/*    差分约束的题目。    先输入n,m,    下面有m组输入,每组4个数据,a,b,c,w;    a表示xi的下标i,b表示顺着xi还有有b个    c == "gt",表示>    c == "lt" 表示<    xi + x(i+1) + ...+ x(i+b) > w or < w    s为xi的前n项和.    得s[a+b] - s[a-1] > k or < k    得 s[a+b] - s[a-1] >= k+1 or  <=  k-1    就可以建图了。    这里还要注意的是spfa的源点不能是0,因为顶点是从0 - n 的。所以,有n+1个点。    在判断负环的时候要>n+1.*/#include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<queue>using namespace std;const int N = 120;typedef struct{    int next;    int to;    int w;}Node;Node edge[N];int n,m;int numedge;int head[N];void addedge(int a,int b,int w){    edge[numedge].to = b;    edge[numedge].w = w;    edge[numedge].next = head[a];    head[a] = numedge++;}bool vis[N];int dis[N];int out[N];bool spfa(int start){    stack<int>s;    int out[N];    memset(out,0,sizeof(out));    memset(vis,false,sizeof(vis));    memset(dis,0x3f,sizeof(dis));    s.push(start);    vis[start] = true;    dis[start] = 0;    while(!s.empty())    {        int cur = s.top();        s.pop();        out[cur]++;        if(out[cur] > n+1)        {            return false;        }        for(int i = head[cur] ; i != -1 ; i = edge[i].next)        {            int x = edge[i].to;            if(dis[x] > dis[cur] + edge[i].w)            {                dis[x] = dis[cur] + edge[i].w;                if(!vis[x])                {                    vis[x] = true;                    s.push(x);                }            }        }        vis[cur] = false;    }    return true;}int main(){    while(scanf("%d",&n) && n)    {        numedge = 0;        scanf("%d",&m);        memset(head,-1,sizeof(head));        int a,b,k;        char s[3];        for(int i = 0 ; i < m ; i++)        {            scanf("%d %d %s %d",&a,&b,s,&k);            if(s[0] == 'g')            {                addedge(a-1,a+b,-k-1);            }            else            {                addedge(a+b,a-1,k-1);            }        }        for(int i = 0 ; i <= n ; i++)        {            addedge(n+1,i,0);        }        if(!spfa(n+1))        {            cout<<"successful conspiracy\n";        }        else        {            cout<<"lamentable kingdom\n";        }    }    return 0;}

原创粉丝点击