POJ 1364 King(差分約束 SPFA)

2021-07-10 12:20:01 字數 1536 閱讀 3321

description

求乙個長度為n的序列si使其滿足給出的m條限制,限制分兩種,某個子串行的和小於或大於k,問這樣的序列是否存在

input

多組用例,每組用例第一行為兩個整數n和m表示序列長度和限制數,之後m行每行首先輸入兩個整數a和b表示該序列的子串行[a,a+b],之後為一字串表示限制種類(gt表示大於,lt表示小於),然後是乙個整數k表示對這個子列的限制,以0結束輸入

output

對於每組用例,如果存在滿足限制的序列則輸出」lamentable kingdom」,否則輸出」successful conspiracy」

sample input

4 2

1 2 gt 0

2 2 lt 2

1 2

1 0 gt 0

1 0 lt 0

0sample output

lamentable kingdom

successful conspiracy

solution

令t[b]=sum[1,b-1],那麼兩種限制可以表示為t[a+b+1]-t[a]<=k-1,t[a]-t[a+b+1]<=-k-1,即差分約束的標準形式,之後用spfa判負環是否存在即可判斷序列是否有解,注意此題需要構造源點0,使得0與每點都相連,這樣可以保證圖連通

code

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

#define maxn 111

#define maxm 1111

struct edge

g[maxm];

int head[maxm],tol;

int dis[maxn];//所有點到起點的最短距離

int cnt[maxn];//統計每個點的入隊次數,若入隊次數大於頂點數說明有負環

void init()//初始化

void add(int u,int v,int c)//單向邊,從u到v,權值為c

int spfa(int s,int n)//單源最短路,s是起點}}

}return

0;//不存在負環

}int main()

for(int i=1;i<=n+1;i++)add(0,i,0);

int ans=spfa(0,n+2);

if(!ans)printf("lamentable kingdom\n");

else

printf("successful conspiracy\n");

}return

0;}

poj 1364 King 差分約束

注意差分約束只能求 或 spfa判斷有無負權迴路。對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值。存在負環的話是無解,求不出最短路 dist 沒有得到更新 ...

poj 1364 King 差分約束

題目大意 有乙個序列。給定一些約束條件,格式為si ni oi ki,意思是序列中第si項到第si ni項的和 或 ki,oi表示 用 gt 表示 或 用 lt 表示 問這樣的序列是否存在。存在輸出 lamentable kingdomi 否則輸出 successful conspiracy 思路 ...

POJ1364 King 差分約束

鏈結 poj1364 題目大意 給你n和m,以及m個約束條件,對於每個約束條件給出si,ni,oi,ki,求是否有乙個n個元素的序列a能滿足這些約束條件。其中oi可以分別表示為gt 和lt 約束條件的定義為as i as i 1 as i ni ki 或asi asi 1 asi ni。解題報告 了...