poj1364King(差分约束系统,判负环)

来源:互联网 发布:单片机制作u盘 编辑:程序博客网 时间:2024/05/18 03:44

原题地址:点击打开链接

s[a] + s[a+1] + …… + s[b] < c 可以转化成前n项和sum[b] - sum[a - 1] < c,为了能用spfa,即将< 转化成 <= ,sum[b] - sum[a - 1] <= c - 1。
#include<stdio.h>#include<string.h>#include<vector>#include<queue>using namespace std;#define inf 1<<28struct node{int v;int w;};int dis[103];bool vis[103];int s_size[105];int n,m;vector<node>e[103];bool spfa(){int u,v,w,i;queue<int>Q;Q.push(0);vis[0]=true;dis[0]=0;s_size[0]++;while(!Q.empty()){u=Q.front();Q.pop();vis[u]=false;for(i=0;i<e[u].size();i++){v=e[u][i].v;w=e[u][i].w;if(dis[v] > dis[u] +w)    {    dis[v]=dis[u]+w;    if(!vis[v])                     {                     vis[v]=true;                     Q.push(v);                     s_size[v]++;                     if(s_size[v]>n)                        return true;                     }    }}}return false;}int main(){int i,j,u,v,w,flag;char str[2];while(scanf("%d",&n)&&n){        scanf("%d",&m);        for(i=0;i<103;i++)            e[i].clear();        for(i=0;i<m;i++){scanf("%d %d %s %d",&u,&v,str,&w);if(strcmp(str,"gt")==0){e[u+v+1].push_back((node){u,-w-1});}else if(strcmp(str,"lt")==0){e[u].push_back((node){u+v+1,w-1});}}for(i=1;i<=n+1;i++)   e[0].push_back((node){i,0});for(i=0;i<=n+1;i++){dis[i]=inf;}memset(vis,false,sizeof(vis));memset(s_size,0,sizeof(s_size));flag=spfa();if(flag)printf("successful conspiracy\n");elseprintf("lamentable kingdom\n");}return 0;} 


0 0
原创粉丝点击