1、內容:是解決多個一元n次不等式組(包含n個變數x1~xn)和m個約束條件,沒個約束條件都是由兩個變數的差值決定的;
eg:xi-xj<=ck;求一組解x1=a,x2=a2……xn=an;
2、求解思路:將不等式xi-xj<=ck視為鬆弛操作,dis[y]<=dis[x]+ci;進而將問題轉化為兩個點之間的距離的問題,將xi,xj視為乙個點,xi-xj>=ck視為從xi到xj的兩個點之間的一條有向邊,最後轉換為單元最短路徑處理。
eg:poj-1201
要求滿足要求的最少整數的個數,即求最少有多少個整數滿足區間的條件,就是求最短路徑,之後用sfpa算方來求。
#include#include#include#include#include#includeusing namespace std;
const int maxn = 50500;
const int inf = 99999999;
bool vis[maxn];
int head[maxn],dis[maxn];
int n,cnt,mi,mx;
struct node;
node p[maxn*3];
void add(int u,int v,int w)
int spfa(int v0)
{ for(int i=mi;i<=mx;i++) dis[i]=-inf;
int top=0;
queue q;
dis[v0]=0;
memset(vis,false,sizeof(vis));
vis[v0]=true;
q.push(v0);
while(!q.empty())
{ int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=p[i].next)
{ int v=p[i].v;
int w=p[i].w;
if(dis[v]參考文章:
POJ 1201 差分約束系統
差分約束系統其實就是將不等式組的求解問題轉化為最短路進行求解,所以屬於圖論。但往往抽象出不等式組是不容易的。差分約束系統入門可看這位大佬的博文 夜深人靜寫演算法 四 本題大意 n個區間,輸入n行ai,bi,ci,代表在區間 ai,bi 上至少要選擇ci個整數點,可以在區間內任意取ci個不重複的點。求...
POJ 1201(差分約束系統)
poj 1201 1 題意 給出n個區間 ai,bi 要求區間內最少選出ci個整數,求出乙個集合z,滿足n個區間的要求,輸出集合z的最小大小。2 思路 滿足最小要求的差分約束系統,需要求出最長路徑,每個區間都能滿足要求。所以將所有的不等式轉化為ai bi 1 ci的形式,還有乙個隱含條件 0 di ...
poj 1201 差分約束
傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...