最短路 差分約束 洛谷P1250

2022-05-29 04:12:11 字數 1872 閱讀 9889

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1..n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b≤e,居民必須記住在指定區不能種多於區域地塊數的樹,所以t≤e-b+l。居民們想種樹的各自區域可以交叉。你的任務是求出能滿足所有要求的最少的樹的數量。

寫乙個程式完成以下工作:

輸入格式:

第一行包含資料n,區域的個數(0第二行包含h,房子的數目(0下面的h行描述居民們的需要:b e t,0輸出格式:

輸出檔案只有一行寫有樹的數目

輸入樣例#1:

9

41 4 2

4 6 2

8 9 2

3 5 2

輸出樣例#1:

5

題解

很簡單的差分約束

很容易發現s[b]-s[e-1]>=t

s[i]-s[i-1]>=0

s[i]-s[i-1]<=1

所以s[e-1]-s[b]<=-t

s[i-1]-s[i]<=0

s[i]-s[i-1]<=1

然後最短路spfa

**如下:

#include#include

#include

#include

using

namespace

std;

struct

edgee[

300005

];int n,m,x,y,z,ecnt,head[50005],dis[50005

];bool used[50005

];queue

q;void add(int a,int b,int

c)int

main()

for(int i=1;i<=n;++i)

add(

0,n+1,0

); memset(dis,

63,sizeof

(dis));

dis[

0]=0

; q.push(0);

used[

0]=1

;

while(!q.empty())}}

}printf("%d

",-dis[n]);

}

另外剛開始時我是用最長路建圖

s[b]-s[e-1]>=t

s[i]-s[i-1]>=0

s[i-1]-s[i]>=-1

但是wa了

求好心人幫忙看下**問題

**如下:

#include#include

#include

using

namespace

std;

struct

edgee[

300005

];int n,m,x,y,z,ecnt,head[50005],dis[50005

];bool used[50005

];queue

q;void add(int a,int b,int

c)int

main()

for(int i=1;i<=n;++i)

add(n+1,n,0

); add(

0,n+1,0

); q.push(0);

used[

0]=1

;

while(!q.empty())}}

}printf("%d

",dis[n]);

}

洛谷 P1250 種樹 貪心

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1.n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b e,居民必須記住在指定區不能種多於區域地塊數的樹,所...

洛谷P1250種樹(貪心)

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1.n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b e,居民必須記住在指定區不能種多於區域地塊數的樹,所...

20190709種樹(洛谷P1250)

題目描述 一條街道的一邊有幾座房子,因為環保原因居民想要在路邊種些樹,路邊的居民被分割成 n 塊,並被編號為 1 n。每塊大小為乙個單位尺寸並最多可種一棵樹。每個居民想在門前種些樹並指定了三個數b,e,t。這三個數分別表示該居民想在b和e之間最少種t棵樹,當然b e,t e b 1,允許居民想種樹的...