sjtu1313 太湖旅行

2022-07-22 06:42:17 字數 2089 閱讀 7806

西山風景區是蘇州著名的國家級風景區,一到暑假,遊客們都蜂擁而至。作為太湖風景區的精華,西山景區吸引人的地方主要在它的群島風光、花果叢林和名勝古蹟。

ginrat對這個地方嚮往已久,在暑假時忙裡偷空出來玩了一次。一到景區,具有特殊觀察力的他就開始觀察,他發現,景區實際上是由太湖的一部分水域和露出水面的許多小島構成的,小島之間由許多橋(或者是堤壩,whatever)連線。ginrat是乙個玩起來很有責任心的人,他非常想要逛完每個島、每個橋,可bj提醒他,網頁小組還等著他回去寫文件,時間緊迫。根據導遊的資訊,這裡共有\(n\)座島,\(m\)座橋,ginrat開跑車經過每個橋或島的時間很少很少,但他卻要在每個橋或島上面好好欣賞風景,這需要一定的時間。他不會重複在乙個島或橋上面欣賞風景。由於時間緊迫,他也降低了自己的目的。如果一座橋連線的兩座島他都在上面欣賞過了,這座橋上的風景他就認為他已經看過了,如果一座島周圍連線的所有的橋上的風景他都看過了,那麼島上的風景他也不想看了。

現在ginrat需要最少的時間來逛完景區,你能幫他嗎?

第一行兩個整數\(n\)和\(m\),分別表示島嶼的數量和橋的數量。

第二行有\(n\)個整數,分別表示n個島嶼ginrat觀光所需要的時間。

第\(3~m+2\)行,每行三個整數,表示這座橋連線的兩個島的編號以及ginrat觀光這座橋上風景所需要的時間。

乙個整數,ginrat觀光所需最少時間。

2 1

2 21 2 1

\(n \le 500,m \le 1500\)

ginrat每次觀光時間不超過\(100000\)

將邊也看成乙個點這個圖便是二分圖,然後就是乙個最小割的經典題了,題解戳這裡。

由於沒有收益,我們便可以把收益看成\(0\),然後連邊即可。

首先將所有的邊點染成黑色,其他的染成白色。

由源點向所有黑點連邊,流量即為黑點的點權。再由所有白點向匯點連邊,流量也為點權。最後若黑白點相連,由黑點向白點連流量為\(inf\)的邊。跑最大流即可。

#include#include#include#include#includeusing namespace std;

#define inf (1<<30)

#define maxn (200010)

int n,m,cnt = 1,source,sink,side[maxn],next[maxn]; bool in[maxn];

int toit[maxn],cap[maxn],cur[maxn],nd[maxn],d[maxn],pre[maxn];

inline int read()

inline void add(int a,int b,int c)

inline void ins(int a,int b,int c)

inline void bfs()

}inline int isap()

bool flag = false;

for (int i = cur[now];i;i = next[i])

if (cap[i] && d[toit[i]] == d[now]-1)

if (flag) continue;

int arg = sink;

if (!--nd[d[now]]) break;

for (int i = side[now];i;i = next[i])

if (cap[i]&&d[toit[i]] < arg) arg = d[toit[i]];

++nd[d[now] = arg+1]; cur[now] = side[now];

if (now != source) now = toit[pre[now]^1];

} return res;

}int main()

printf("%d",isap());

fclose(stdin); fclose(stdout);

return 0;

}

SJTU排隊與插隊

春節前後的寒假開始總是交通高峰期的開始。如果您這時候嘗試購買火車票,就會目睹每個售票視窗前無盡的排隊。如果乙個人在佇列中見過他的朋友,那麼這個幸運的人很可能會直接去找他的朋友求情。這稱為 插隊 對於排隊的其他人來說,這是不公平的,但這就是生活。您的任務是編寫乙個程式,模擬乙個這樣的佇列,人們不時地排...

SJTU簡單路徑數目

description 大家還記得鄰接錶類嗎?沒錯,鄰接表是表示稀疏圖 邊數比較少的圖 的一種很好的資料結構。現在,我們要求使用深度優先遍歷的思想,利用鄰接錶類,對給定的有向圖,找出從指定結點start出發,長度為m的所有簡單路徑 簡單路徑是頂點序列中頂點不重複出現的路徑 的數量。為簡化題目,我們還...

sjtu 1006 求和遊戲

c 程式編寫 該命題可以看做是求陣列的最大子陣列問題,且最大子陣列中元素最小個數人為2 即最大子陣列元素的個數不能為1 include using namespace std int main bool flag true for int i 0 i n i if result pi i if fl...