题意:N个人去m个星球,给出n个人可以去哪些星球的01矩阵。求是否能满足所有人都去。(n到10万,m<=10)
一看,起先一瞬间就建图,准备秒了,人向星球连边,直接最大流判断是否为n,提交超时。。。是啊,10W*10=100W条边,铁定超时。。
后来经牛提示:注意,m<10! 人的可以去星球,一共最多有10个,那只有 2^10次种情况,就是说x部与Y部连线情况很多点是一样的(所给的01矩阵,最多10W行,10列,必然有很多行是一样的)。所以X部只留1024个点,这些点中,点i含j个人的状态,者源点向其连边j,该点向可以去的连边,流量inf.
#include#include #include #include #include using namespace std;const int inf=0x3f3f3f3f;const int maxv=2000,maxe=200000;int nume=0;int head[maxv];int e[maxe][3];void inline adde(int i,int j,int c){ e[nume][0]=j;e[nume][1]=head[i];head[i]=nume; e[nume++][2]=c; e[nume][0]=i;e[nume][1]=head[j];head[j]=nume; e[nume++][2]=0;}int ss,tt,n,m;int vis[maxv];int lev[maxv];bool bfs(){ for(int i=0;i