差分約束 poj 1364 King

2021-09-01 02:03:02 字數 1042 閱讀 3328

大致題意:

告訴你有一列長度為n的數列和m個關係式。每個關係式的表述為:

si ni 「gt」 c 或者是  si ni 「lt」 c。分別代表該數列第si項一直加到第si+ni項的和大於c,和第si項一直加到第si+ni項的和小於c。求是否存在滿足以上m個要求的數列。是則輸出「lamentable kingdom」,否則輸出「successful conspiracy」。

大致思路:

把問題轉化為差分約束。將差分約束系統中的點sum[i]設為這個數列前i項的和。當要求第si項一直加到第si+ni項的和大於c的時候,就等價於sum[si+ni]-sum[si-1]>c,又由於差分約束系統中只能出現<=關係且這裡的數字都是整數,所以上式又可以轉化為sum[i-1]-sum[i+n]<=-c-1。

對於「第si項一直加到第si+n項的和小於c」的要求,我們同樣可以將其轉化為sum[si+ni]-sum[si-1]<=c-1;

按照得到的式子構出差分約束系統,用spfa判斷是否存在可行解即可。

詳細**:

#include#include#include#includeusing namespace std;

const int nmax=1050;

const int mmax=1000050;

const int inf=1<<28;

structedge[mmax];

int n, k, head[nmax];

int dis[nmax],issea[nmax];

int stack[nmax],m,sum[nmax];

bool vis[nmax];

void addedge(int a,int b,int w)

bool spfa(int s)}}

vis[u]=false;

}return 1;

}int main()

while(m--)

else

}if(spfa(s))

else

}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。解題報告 了...