題目鏈結
題意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...