HDU 3605 Escape 狀態壓縮最大流

2021-10-24 05:24:58 字數 1590 閱讀 5925

題目鏈結

題意n個人(範圍10w),m個星球(範圍10),每個人有對星球的不同喜好,每個星球有自己的容量,問能否讓所有人都在滿意的星球上?

思路一眼就是最大流(二分匹配我沒學。。),樸素做法s向人連邊權1,人向感興趣星球連邊權1,星球向t連邊權為容量,跑dinic,一遍tle,蕪湖~

最多只有10個星球,那麼對星球的喜好也就最多只有1024種組合。最多10w人,他們除了喜好不同外,沒有任何別的資訊,所以完全可以用組合代替人做節點。先統計不同狀態的人數,s向狀態連邊,權為狀態人數,狀態向星球連邊,權為人數,星球向t連邊,權容量,這樣就能將v從1e5壓縮到1e3,e也從1e6到了1e4的級別。

時限2s,狀壓dinic跑了1.2s。

**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define endl "\n"

//#define int long long

using

namespace std;

typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const

int maxn=

100100

;const

int maxe=

2500010

;int head[maxn]

,cnt;

struct edgeedge[maxe]

;int n,m,s,t;

ll maxflow;

int deep[maxn]

;int now[maxe]

;void

init()

void

add(

int u,

int v,

int w)

inline

bool

bfs()}

}return0;

} ll dfs

(int x,

int flow)

}return ans;

}void

dinic()

int sta[

5000];

intmain()

} sta[tmp]++;

}for

(int i=

1;i<(1

<;i++)}

}}for(

int i=

1;i<=m;i++

)dinic()

;if(maxflow==n)

printf

("yes\n");

else

printf

("no\n");

}return0;

}

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

題意 有n個人要去到m個星球上,這n個人每個人對m個星球有乙個選擇,即願不願意去,y or n 問是否可以全部人都順利到自己想去的星球。思路 很 有趣 的一道題目,n是1e5的大小,m只有10,沒有想到狀態壓縮,看到n這麼大肯定超時還是強行寫了一波,於是re tle 想了挺久還是不會。看別人的思路是...

HDU 3605 Escape 最大流,狀態壓縮

地球上有 n 1 leq n leq 100000 個人需要移居到 m 1 leq m leq 10 個外星球上,每個人只有特定的若干個外星球可供選擇,每個外星球有接受移居的人數上限,問能否讓所有人移居成功。由於 n 的範圍有 1e5 直接建圖的話邊可能達到 1e6 條,跑最大流會超時。考慮到 m ...

HDU 3605 Escape 最大流,狀壓

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