POJ 1201 Intervals 差分約束系統

2021-07-25 03:08:51 字數 1734 閱讀 2016

題目:

有乙個序列,題目用n 個整數組合[ai,bi,ci]來描述它,[ai,bi,

ci]表示在該序列中處於[ai,bi]這個區間的整數至少有ci 個。如果存在這樣的序列,請求

出滿足題目要求的最短的序列長度是多少。如果不存在則輸出-1。

輸入:第一行包括乙個整數n,表示區間個數,以下n 行每行描述這些區間,第i+1 行

三個整數ai,bi,ci,由空格隔開,其中0<=ai<=bi<=50000 而且1<=ci<=bi-ai+1。

輸出:一行,輸出滿足要求的序列的長度的最小值。

輸入樣例:

537 3

8 10 3

6 8 1

1 3 1

10 11 1

輸出樣例:

6分析:

線性函式,其實是可以轉化為單源最短路徑問題,從而用剛才所準備到的bellman ford演算法

來解決它。

**:const

maxn=150000;

type

node=record

fromv,endv,value:longint;

end;

vardata:array[0..maxn] of longint;

elist:array[0..maxn] of node;

n,m,max,min:longint;

procedure add(x,y,z:longint);

begin

inc(m);

with elist[m] do

begin

fromv:=x;

endv:=y;

value:=z;

end;

end;

procedure init;

vari,x,y,z:longint;

begin

readln(n);

m:=0;max:=0;min:=maxlongint;

for i:=1 to n do

begin

readln(x,y,z);

dec(x);

add(y,x,-z);

if maxx then

min:=x;

end;

for i:=min+1 to max do

begin

add(i-1,i,1);

add(i,i-1,0);

end;

end;

procedure main;

vari:longint;

check:boolean;

begin

for i:=min to max do

data[i]:=100000;

while true do

begin

check:=true;

for i:=1 to m do

with elist[i] do

if data[endv]>data[fromv]+value then

begin

data[endv]:=data[fromv]+value;

check:=false;

end;

if check then

break;

end;

writeln(data[max]-data[min]);

end;

begin

init;

main;

end.

差分約束 poj 1201 Interval

差分約束 poj 1201 又是一道vector tle。確實很好的差分約束。很好的差分約束,注意隱含條件 0 d i 1 d i 1 題目保證了沒負圈。include include include using namespace std define n 50005 define inf 100...

POJ 1201 樹狀陣列

給你n個區間,每個區間為 a,b 每個區間取c個數構成乙個集合,求集合最小容量 把區間按b排序,從第乙個區間開始取,從後往前取,這樣盡可能和後面的區間重複 另外如果我們發現當前區間取得個數已經超過了c,那麼只需要讓之前區間換就行,而總數是不變的,所以不用更新答案 求當前區間已經取了多少個數用樹狀陣列...

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 ...