您的位置:首页 > 其它

BZOJ 1433 [ZJOI2009]假期的宿舍

2017-02-28 19:48 246 查看
默默地断更好久,总算还是决定厚着脸皮先来水一篇续上。。。

orz Chester_king帮我发现初始化问题。。。

#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define INF 1e8
using namespace std;

struct Edge{
int from,to,cap,flow;
};

vector <Edge> edges;
vector <int> G[105];

int T,s,t,n,m,a[51],b[51],d[105],v[105],cur[105];

void add(int x,int y,int cap,int flow)
{
edges.push_back((Edge){x,y,cap,0});
G[x].push_back(m);
++m;
edges.push_back((Edge){y,x,0,0});
G[y].push_back(m);
++m;
}

int BFS(int s,int t)
{
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
d[s]=0;
v[s]=1;
queue<int>dui;
dui.push(s);
while(!dui.empty())
{
int p=dui.front();
dui.pop();
for(int i=0;i<G[p].size();++i)
{
Edge e=edges[G[p][i]];
if(!v[e.to]&&e.cap>e.flow)
{
v[e.to]=1;
d[e.to]=d[p]+1;
dui.push(e.to);
}
}
}
return v[t];
}

int min(int a,int b){return a<b?a:b;}

int DFS(int x,int a)
{
if(x==t||a==0)
return a;
int f,flow=0;
for(int &i=cur[x];i<G[x].size();++i)
{
Edge &e=edges[G[x][i]];
if(d[e.to]==d[x]+1&&(f=DFS(e.to,min(a,e.cap-e.flow))>0))
{
e.flow+=f;
a-=f;
edges[G[x][i]^1].flow-=f;
flow+=f;
if(a==0)
break;
}
}
return flow;
}

int maxflow(int s,int t)
{
int flow=0;
while(BFS(s,t))
{
memset(cur,0,sizeof(cur));
flow+=DFS(s,INF);
}
return flow;
}

int main()
{
scanf("%d",&T);
while(T--)
{
edges.clear();
scanf("%d",&n);
int i,j,p,tmp=0;
for(i=0;i<=104;++i)
G[i].clear();
m=0;
s=0,t=104;
for(i=1;i<=n;++i)
{
scanf("%d",&a[i]);
if(a[i])
add(i+n,t,1,0); //这个人有床,连一条边
}
for(i=1;i<=n;++i)
{
scanf("%d",&b[i]);
if((a[i]&&!b[i])||!a[i]) //这个人不是在校生或者是回家的在校生就连一条边,他要住在学校里
{
++tmp;
add(s,i,1,0);
}
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
scanf("%d",&p);
if((p&&a[j])||i==j) //i和j认识并且j有床或者是他自己连一条边
add(i,j+n,1,0);
}
if(maxflow(s,t)==tmp)
printf("^_^\n");
else
printf("T_T\n");
}
return 0;
}

写给自己:考试爆炸心态很崩?不行那就不是我了。赶紧开始搞事,做上进的好学生。毕竟爆炸了代表进步空间很大(逃)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: