萌新学姐刚学OI,dinic全WA求助
查看原帖
萌新学姐刚学OI,dinic全WA求助
341329
Alexandra楼主2023/7/6 11:48
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> 
#include<algorithm>//亲亲 
using namespace std;
#define N 1100
#define M 100010
#define INF 0x3f3f3f3f3f3f3f3f
long long hhk,s,t,n,sum,mmax,a[N][N],b[N],c[N],d[M],cur[M],First[M],tot=-1;
struct fun
{
	long long v,w,Next;
}e[M];
inline long long read()
{
	long long wjl=0,jia=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')jia*=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		wjl=(wjl<<1)+(wjl<<3)+(ch^48);
		ch=getchar();
	}
	return wjl*jia;
}
inline void add(long long x,long long y,long long z)
{
	e[++tot].v=y;
	e[tot].Next=First[x];
	e[tot].w=z;
	First[x]=tot;
	e[++tot].v=x;
	e[tot].w=0;
	e[tot].Next=First[y];
	First[y]=tot;
}
bool bfs()
{
	memset(d,-1,sizeof(d));
	queue<int>q;
	q.push(s);
	d[s]=1;
	while(!q.empty())
	{
		long long u=q.front();
		q.pop();
		for(long long i=First[u];~i;i=e[i].Next)
		{
			long long v=e[i].v,w=e[i].w;
			if(d[v]==-1&&w)
			{
				d[v]=d[u]+1;
				q.push(v);
			}
		}
	}
	return d[t]!=-1;
}
long long dfs(long long x,long long t,long long minf)
{
	if(x==t||minf==0)return minf;
	long long f,flow=0;
	for(long long i=cur[x];~i;i=e[i].Next)
	{
		long long y=e[i].v,z=e[i].w;
		cur[x]=i;
		if(z&&d[y]==d[x]+1)
		{
			long long f=dfs(y,t,min(minf,z));
			if(f)
			{
				minf-=f;
				flow+=f;
				e[i].w-=f;
				e[i^1].w+=f;
				if(minf==0)return flow;
			}
		}
	}
	return flow;
}
void dinic()
{
	while(bfs())
	{
		for(long long i=1;i<=t;i++)cur[i]=First[i];
		mmax+=dfs(s,t,INF);
	}
}
int main ()
{
	hhk=read();
	while(hhk--)
	{
		n=read();
		s=2*n+1,t=2*n+2;
		tot=-1,sum=0,mmax=0;
		memset(First,-1,sizeof(First));
		for(long long i=1;i<=n;i++)//是否有床 
		{
			b[i]=read();
			if(b[i])add(n+i,t,1);
		}
		for(long long i=1;i<=n;i++)//是否在这里住 
		{
			c[i]=read();
			if((!c[i]&&b[i])||b[i]==0)add(s,i,1),sum++;
		}
		for(long long i=1;i<=n;i++)
		{
			for(long long j=1;j<=n;j++)
			{
				long long o=read();
				if(i==j||o)add(i,j+n,INF);//只需要单向的
			}
		}
		if(mmax>=sum)printf("^_^\n");
		else printf("T_T\n");
	}
	return 0;
}
2023/7/6 11:48
加载中...