NOIP2010提高組 引水入城(BFS)

2021-07-22 23:15:08 字數 1470 閱讀 9484

【問題描述】

在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。

為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水幫浦將湖泊中的水抽取到所在城市的蓄水池中。因此,只有與湖泊毗鄰的第1 行的城市可以建造蓄水廠。而輸水站的功能則是通過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。

由於第n 行的城市靠近沙漠,是該國的乾旱區,所以要求其中的每座城市都建有水利設施。那麼,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求乾旱區中不可能建有水利設施的城市數目。

前三組資料的問題好解決,將最上面一排的所有點bfs一遍,最後查詢最後一排的點沒訪問過的數目就行。後面的資料用搜尋能過三組資料。但是要想ac,需要知道乙個條件,即在每座城市都建有水利設施情況下,每乙個蓄水廠能夠覆蓋的乾旱區都是乙個區間。如果兩個蓄水廠a,b對應的乾旱區c,d的路線ad,bc有交點,如圖

#include

#include

#include

#include

using namespace std;

const int maxn=502;

int n,m,inq[maxn][maxn],a[maxn][maxn];

int dx=;

int dy=;

struct data

;data g[maxn];

void bfs(int

s));

inq[1][s]=s;

while(!q.empty())

);inq[tx][ty]=s;}}

}int main()

memset(inq,0,sizeof(inq));

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

int cnt=0;

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

if(cnt>0) printf("0\n%d\n",cnt);

else

if(t==m+1) continue;

k++;

g[k].x=t;

g[k].y=g[k].x-1;

for(int j=1;j<=m;j++)

}int

s=1,t=m,i=1,num=0;

while(i<=m&&s

<=t)

if(last

num++;

s=last+1;

}printf("1\n%d\n",num);

}return

0;}

NOIP2010提高組 引水入城

這題。以前打的,很暴力的bfs include include using namespace std int a 502 502 ll 502 rr 502 data 300001 2 bool bz 502 502 int temp,n,m const int way 5 2 void bfs ...

引水入城 noip2010

題目描述 description 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政 區劃十分特殊,剛好構成乙個n行m列的矩形,如上圖所示,其中每個格仔都代表一座城 市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施 ...

NOIP2010 引水入城

兩遍bfs floodfill,第一遍bfs可以判斷出最後是輸出0還是輸出1,第二遍bfs floodfill不懂 program flow const dx array 1.4 of 1.1 1,0,1,0 dy array 1.4 of 1.1 0,1,0,1 type atp record x...