poj 1364 King 差分约束

来源:互联网 发布:托福报名 知乎 编辑:程序博客网 时间:2024/05/17 14:14

差分约束系统

写了两种解法

第一种是bellman-ford

第二种是spfa

 

 

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=302;
const int inf=1<<29;
int e[maxn][maxn];
int n,m;

int dist[maxn];

int solve()
{
    for(inti=0;i<=n;i++)
   dist[i]=-inf;
   dist[0]=0;
    for(intk=0;k<=n;k++)
    for(inti=0;i<=n;i++)
    for(intj=0;j<=n;j++)
   if(e[i][j]+dist[i]>dist[j])
   dist[j]=e[i][j]+dist[i];
    for(inti=0;i<=n;i++)
    for(intj=0;j<=n;j++)
   if(e[i][j]+dist[i]>dist[j])
   return(1);
   return(0);
}


int main()
{
    freopen("in.txt","r",stdin);
   while(scanf("%d%d",&n,&m)!=EOF)
    {
       if(n==0) break;
       for(int i=0;i<=n;i++)
       for(int j=0;j<=n;j++) e[i][j]=-inf;
       char g[5];
       for(int i=1,a,b,c;i<=m;i++)
       {
           scanf("%d %d %s%d",&a,&b,g,&c);
           b+=a;
           if(g[0]=='g')
           e[a-1][b]=c+1;
           else
           e[b][a-1]=-c+1;
       }
       if(solve()) printf("successful conspiracy\n");
       else printf("lamentable kingdom\n");
    }
    return0;
}

 

 

 

 

 

 

 

 

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=302;
const int inf=1<<29;
int e[maxn][maxn];
int n,m;

int text[maxn],queue[1000001],front,end;
int dist[maxn],time[maxn];
int ture;

int spfa()
{
    intt=queue[front++];
   text[t]=0;
    for(inti=0;i<=n;i++)
   if(dist[t]+e[t][i]>dist[i])
    {

       dist[i]=dist[t]+e[t][i];
//       printf("%d %d\n",dist[i],i);
//       printf("%d\n",dist[i]);
       if(!text[i])
       {
           text[i]=1;
           queue[++end]=i;
           time[i]++;
           if(time[i]>n+2)
           {
               front=inf;
               ture=1;
               return(0);
           }
       }
    }
}


int solve()
{
   memset(text,0,sizeof(text));
   memset(time,0,sizeof(time));
   ture=0;
    for(inti=0;i<=n;i++)
   dist[i]=-inf;
   dist[n]=0;
   front=1,end=1;
   queue[front]=n;
   while(front<=end)
   spfa();
//    for(inti=1;i<=n;i++)
//    printf("%d",dist[i]);
}


int main()
{
//   freopen("in.txt","r",stdin);
   while(scanf("%d%d",&n,&m)!=EOF)
    {
       if(n==0) break;
       n++;
       for(int i=0;i<=n;i++)
       for(int j=0;j<=n;j++) e[i][j]=-inf;
       char g[5];
       for(int i=1,a,b,c;i<=m;i++)
       {
           scanf("%d %d %s%d",&a,&b,g,&c);
           b+=a;
           if(g[0]=='g')
           e[a-1][b]=c+1;
           else
           e[b][a-1]=-c+1;
       }
       for(int i=0;i<=n;i++) e[n][i]=0;

       solve();
       if(ture) printf("successful conspiracy\n");
       else printf("lamentable kingdom\n");
    }
    return0;
}