題意:給定若干區間,並為每個區間指定乙個數值。如區間為[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 ...