HDU 3605 Escape(最大流 狀態壓縮)

2022-02-07 17:48:16 字數 1704 閱讀 7785

題意:有n個人要去到m個星球上,這n個人每個人對m個星球有乙個選擇,即願不願意去,「y」or"n"。問是否可以全部人都順利到自己想去的星球。

思路:很「有趣」的一道題目,n是1e5的大小,m只有10,沒有想到狀態壓縮,看到n這麼大肯定超時還是強行寫了一波,於是re(tle)。想了挺久還是不會。看別人的思路是說二進位制狀態壓縮。看到這就想到m只有10,於是可以分成1<<10 = 1024種情況,代表有這個選擇,就相當於把人從1e5的大小強行壓到1e3了。然後源點->選擇->星球->匯點這樣的圖就建好了。源點->選擇的邊權是每種選擇的人數,選擇->星球的邊權是對於每種選擇,選擇了這個星球的人數,星球->匯點的邊權是星球容納的人數。就醬了。mark。

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7 #include 8 #include 9 #include 10 #include

11using

namespace

std;

12#define inf 0x3f3f3f3f

13#define n 1200

14#define num 1024

15 typedef long

long

ll;16

struct

edge

19 edge (int v, int nxt, int

cap) : v(v), nxt(nxt), cap(cap) {}

20 }edge[n*n*2

];21

int tot, head[n], cur[n], pre[n], dis[n], gap[n], s, t, tol[55

];22

23void add(int u, int v, int

cap)

2728

void

bfs() 43}

44}4546

int isap(int

n) 61

//puts("aaaa");

62for(i = cur[u]; ~i; i =edge[i].nxt)

63if(dis[edge[i].v] == dis[u] - 1 && edge[i].cap > 0) break;64

//puts("bbbb");

65if(~i) else77}

78return

ans;79}

8081

intmain()

95 s[ss]++;

96for(int j = 1; j <= m; j++) 99}

100for(int i = 1; i <= m; i++) scanf("

%d", &tol[i]);

101for(int i = 0; i <= 1024; i++)

107}

108}

109for(int i = 1; i <= m; i++) add(num +i, t, tol[i]);

110int ans = isap(t + 1

);111

if(ans == n) puts("

yes"

);112

else puts("no"

);113

114}

115return0;

116 }

HDU 3605 Escape 最大流,狀壓

最大流,n比較大,但是m只有10,所以對應的人的狀態最多有2 m種,因此可以對人進行歸類,那樣n的資料量就只有1024了,求最大流 g 交會超時 要用c include include include include include define maxn 1100 define maxe 2100...

最大流 縮點 HDU 3605 Escape

有n個人,m個星球。每個人都對不同的星球有自己的喜好,每個星球都有自己的容量。問能否讓所有的人都呆在自己喜歡的星球裡。1 n 100000 m 1 m 10 以為是套模板的題,一直tle,mle。看了大佬的 才明白這題需要縮點。因為最多有10個星球,所以最多有 include include inc...

HDU 3605 Escape (最大流 縮點)

題意 給你n個人,m個星球,每個人對這m個星球的都有一定的適應能力,每個星球都有一定的容納量,問能否讓所有的人在星球上生存。剛開始做的時候一直tle 不知道為什麼,改著改著發現建圖的時候,添了很多邊,這樣跑最大流非常慢,看了網上的思路才知道要縮點,因為星球最多才有10個,所以把每個星球適合住的人數存...