Week8作業 A 區間選點II 差分約束

2021-10-04 22:34:49 字數 1090 閱讀 9891

給定乙個數軸上的n個區間,要求在數軸上選取最少的點使得第i個區間[ai,bi]裡至少有ci個點。1<=n<=50000, 0<=ai<=bi<=50000, 1<=ci<=bi-ai+1。

記sum[i]表示數軸上[0,i]之間選點的個數,則對於第i個區間[ai,bi]需要滿足sum[bi]-sum[ai-1]>=ci。同時需要保證sum有意義:0<=sum[i]-sum[i-1]<=1。

對於不等式xi-xj>=ck,從j到i連一條長度為ck的有向邊,然後用spfa求最長路即可。最後的最小解就是sum[max]。

一道關於差分約束的題,構造不等式,化為有向邊,然後最小解就跑最長路。坑點:最長路inf應為最小值,不等式的構造,以及spfa的起始點應該為min而不是0。

#include

#include

using

namespace std;

int n,a,b,c;

int inf=

-100000

;//鏈式前向星

struct edge

;edge e[

510000];

int head[

51000

],tot;

int sum[

51000];

bool vis[

51000];

int maxbi=

0,minai=

51000

;void

add(

int x,

int y,

int w)

//求最長路

void

spfa

(int s)}}

}}intmain()

//0<=sum[i]-sum[i-1]<=1

//(i-1,i,0)和(i,i-1,-1)

for(

int i=minai;i<=maxbi;i++

)add

(i-1

,i,0),

add(i,i-1,

-1);

spfa

(minai-1)

; cout<<}

Week8作業 A 區間選點II

問題描述 給定乙個數軸上的n個區間,要求在數軸上選取最少的點使得第i個區間 ai,bi 裡至少有ci個點。1 n 50000,0 ai bi 50000,1 ci bi ai 1。差分約束系統求解 結論 1.如果要求取最小值,則求最長路,將不等式全部化成xi xj k的形式,這樣建立j i的邊,權值...

Week 8 作業A 區間選點II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點。輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci bi ai 1...

Week8 作業 A 區間選點 II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 input 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai b...