poj 1201 spfa 區間取數

2021-06-22 22:44:32 字數 1048 閱讀 6851

題意:給定若干區間,並為每個區間指定乙個數值。如區間為[ai,bi],數值為ci。求乙個最小集合s,使得每個區間[ai,bi]都至少包含其中的ci個數。

思路:差分約束思想。s[bi+1]-s[ai]>=ci; bi+1的原因是bi也要選進來。對於這種閉區間,要注意邊界的選擇。此外還必須有:s[i]-s[i-1]<=1和s[i]-s[i-1]>=0。

乙個技巧:i->i-1和i-1->i這些邊不要加進來,可以直接判斷!再有需要注意的是,dis陣列要初始化為負無窮,而不是0,因為求的是最長路。

#include #include #define n 50010

#define inf 0x3ffffff

#define min(a,b) ab?a:b

struct edgee[n];

int n,begin,end,top;

int q[1500000],dis[n],first[n],visited[n];

void init()

void add(int x,int y,int w)

int relax(int a,int b,int w)

return 0;

}void spfa()

if(now>begin && dis[now]-1 > dis[now-1])

} if(nowdis[now+1])

} }}int main()e[n*3];

int first[n],top;

int dis[n],used[n];

void add(int x,int y,int w)

int relax(int x,int y,int w)

return 0;

}int spfa(int s,int t)}}

return dis[t];

}int main(){

int i,a,b,c;

top = 0;

clc(first,-1);

be = n;

en = 0;

scanf("%d",&n);

for(i = 0;i

poj1201 spfa差分約束

差分約束就是把不等式似的的東西轉化為最短路求解,格式是所有式子都是兩個未知數的差小於等於某個常數的就算,當然大於等於也可以,本題就是大於等於,乘 1就好 1201題意 ai,bi 上至少要選擇ci個整數點,可以在區間內任意取不重複的點 問最少選多少個點,這麼些區間有重合部分,所以,列不等式啦 s b...

poj 1201 差分約束 spfa

題意 在區間 0,50000 上有一些整點,並且滿足n個約束條件 u,v,w 即在區間 u,v 上至少有x個整點,問區間 0,50000 上至少有幾個整點。思路 spfa 鄰接表 差分約束。構造差分約束系統的關鍵 用dict i 表示區間 0,i 上的整點數,則約束條件可化為dict v dict ...

POJ 1201 Intervals(區間約束)

思路 區間約束問題,轉最長路跑spf aspfa spfa 注意區間是 0,50000 0,50000 0,500 00 但是我們連邊是add u 1 v,w add u 1,v,w add u 1,v,w 所以考慮整體右移一位,然後從0 00開始跑,此外還有乙個限制是 d v d v 1 0,1 ...