大致題意:
告訴你有一列長度為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。解題報告 了...