NOIP2010 引水入城

2021-09-10 03:19:08 字數 1478 閱讀 7410

這道題從高到低建圖,因為有無解的情況,所以從海邊可建造蓄水池的地方開始搜尋,如果最後一行有搜不到的,那麼直接統計一下個數,輸出就好。顯然搜尋不能dfs,深度太大會爆棧啊,所以bfs也可以實現。至於有解的情況,我們考慮乙個性質,乙個點向下傳遞,在最後一行能夠便利到的點一定是聯通的,否則的話是無解的情況,所以我們仍然以每個蓄水池搜尋,算出其覆蓋最後一行的左右區間,然後dp。

還有一種方法,將每乙個蓄水池的覆蓋範圍看成一條線段,算出區間端點後,對於a,b兩個線段,若b的左端點<=a的右端點+1,兩個左端點連一條權值為1的邊,跑1->m的最短路就行,至於為什麼,自己畫圖體會,很容易理解。

1

#define maxn 550ul

23 #include4 #include5 #include6 #include7

#define min(a,b) (a)

8using

namespace

std;

9int n,m,cnt,head[maxn*maxn];

10int

h[maxn][maxn],id[maxn][maxn],ans,la;

11bool vis[maxn*maxn],flag=0;12

intf[maxn];

13int

ls[maxn],rs[maxn];

14struct

nodeeda[1000110

];17

void add(int x,int

y)23

struct

xsd[maxn*maxn];

26int cop(const xs a,const

xs b)

2930

void bfs(int

t)38

while(!st.empty())47}

48}49}

50int

main()59}

60for(int i=1;i<=n;i++)67}

68 bfs(0

);69

bool ok=0; int lr=0;70

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

76if

(ok)

80else90}

91}92 memset(f,30,sizeof

(f));

93 f[0]=0;94

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

100}

101}

102 printf("

1\n%d

",f[m]);

103}

104getchar(); getchar();

105 }

view code

posted @

2015-10-09 20:18

lenicodes 閱讀(

...)

編輯收藏

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

NOIP2010 引水入城

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

NOIP 2010 引水入城

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