求助!P3153 WA 82分
  • 板块灌水区
  • 楼主羊叫兽同学
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/6/5 07:46
  • 上次更新2023/10/27 23:58:58
查看原帖
求助!P3153 WA 82分
476767
羊叫兽同学楼主2022/6/5 07:46

题目

记录

代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int aaa=1145140;
int n,m,s,l,t,ans,top=1,i,j,k,x,qwq,u[aaa],v[aaa],w2[aaa],w[aaa],first[aaa],nxt[aaa],second[aaa],sd[aaa],cnt[aaa];
char f;
queue<int>q;
void add(int a,int b,int c)
{
	top++;
	u[top]=a;
	v[top]=b;
	w2[top]=c;
	nxt[top]=first[a];
	first[a]=top;
	top++;
	u[top]=b;
	v[top]=a;
	nxt[top]=first[b];
	first[b]=top;
}
int dfs(int x,int flow)
{
	if(x==t)
	{
		ans+=flow;
		return flow;
	}
	int i,sum=0,mi;
	for(i=second[x];i!=0;i=nxt[i])
	{
		second[x]=i;
		if(w[i]!=0&&sd[v[i]]+1==sd[x])
		{
			mi=dfs(v[i],min(flow,w[i]));
			if(mi!=0)
			{
				w[i]-=mi;
				w[i^1]+=mi;
				sum+=mi;
				if(sum==flow)
					return sum;
			}
		}
	}
	cnt[sd[x]]--;
	if(!cnt[sd[x]])
		sd[s]=3*n+3;
	sd[x]++;
	cnt[sd[x]]++;
	return sum;
}
int main()
{
	scanf("%d%d",&n,&k);
	s=100000;
	t=200000;
	for(i=1;i<=n;i++)
	{
		add(i,i+100,k);
		for(j=1;j<=n;j++)
		{
			cin>>f;
			if(f=='Y')
				add(i,j+200,1);
			else
				add(i+100,j+200,1);
		}
	}
	while(true)
	{
		qwq++;
		for(i=1;i<=n;i++)
			add(s,i,1);
		for(i=1;i<=n;i++)
			add(i+200,t,1);
/*		for(i=1;i<=top;i++)
			if(w[i])
				cout<<u[i]<<" "<<v[i]<<endl;*/
		memcpy(w,w2,sizeof(w));
		while(!q.empty())
			q.pop();
		memset(sd,-1,sizeof(sd));
		memset(cnt,0,sizeof(cnt));
		sd[t]=ans=0;
		cnt[0]=1;
		while(!q.empty())
		{
			x=q.front();
			q.pop();
			for(i=first[x];i!=0;i=nxt[i])
			{
				if(sd[v[i]]==-1)
				{
					sd[v[i]]=sd[x]+1;
					cnt[sd[v[i]]]++;
					q.push(v[i]);
				}
			}
		}
		while(sd[s]<n*3+2)
		{
			memcpy(second,first,sizeof(first));
			dfs(s,1e9+7);
		}
//		cout<<ans<<endl;
		if(ans!=qwq*n)
		{
			printf("%d",qwq-1);
			return 0;
		}
	}
}
2022/6/5 07:46
加载中...