81 分求助
查看原帖
81 分求助
154101
MatrixCascade楼主2021/4/12 17:13

RT,和第一篇题解思路杈不多,他是二分答案我写的是暴力 for 循环,没 TLE,WA 最后两个点

我用其他号交了发题解发现可以过

求 debug

//Author : MatrixCascade

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define clr(f, n) memset(f, 0, sizeof(int) * (n))
#define cpy(f, g, n) memcpy(f, g, sizeof(int) * (n))
#define rev(f, n) reverse(f, f + n)
#define pir pair<int, int>
#define mkp make_pair
#define fst it->first
#define sec it->second
#define int long long
#define up(i,x,y) for(int i=x,i##end=y;i<=i##end;++i)
#define down(i,x,y) for(int i=x,i##end=y;i>=i##end;--i)
using namespace std;
int n, m, k;
int read()
{
    int s = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s * f;
}
inline void print(int *f, int len)
{
    for (int i = 0; i < len; i++)
        printf("%lld ", f[i]);
    puts("");
}
int s,t;
const int maxn=2003030;
int head[maxn],to[maxn],nxt[maxn],w[maxn],tot=1;
int dep[maxn];
int cur[maxn];
const int inf=1<<30;
void addd(int a,int b,int c)
{
	to[++tot]=b;
	w[tot]=c;
	nxt[tot]=head[a];
	head[a]=tot;
}
void add(int a,int b,int c)
{
	addd(a,b,c);
	addd(b,a,0);
}
bool bfs()
{
	memset(dep,0,sizeof(dep));
	queue<int>q;
	cur[s]=head[s];
	q.push(s);
	dep[s]=1;
	while(!q.empty())
	{
		int x=q.front();q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			int v=to[i];
			if(w[i]&&!dep[v])
			{
				q.push(v);
				dep[v]=dep[x]+1;
				cur[v]=head[v];
				if(v==t)return 1;
			}
		}
	}
	return 0;
}
int dinic(int x,int flow)
{
	if(x==t)return flow;
	int rst=flow;
	int fl;
	for(int i=cur[x];i&&rst;i=nxt[i])
	{
		cur[x]=i;
		int v=to[i];
		if(w[i]&&dep[v]==dep[x]+1)
		{
			fl=dinic(v,min(rst,w[i]));
			if(!fl)dep[v]=0;
			w[i]-=fl;w[i^1]+=fl;
			rst-=fl;
		}
	}
	return flow-rst;
}
int solve()
{
	int flow=0,maxflow=0;
	while(bfs())
	{
		while(flow=dinic(s,inf))maxflow+=flow;
	}
	return maxflow;
}
char c[101][101];
int check(int x)
{
	memset(head,0,sizeof(head));
	tot=0;up(i,1,n)add(s,i,x),add(i+n*2,t,x),add(i,i+n,k),add(i+n*3,i+n*2,k);
	up(i,1,n)
	{
		up(j,1,n)
		{
			if(c[i][j]=='Y')add(i,j+2*n,1);
			else add(i+n,j+3*n,1);
		}
	}
	if(solve()==x*n)return 1;
	return 0;
}
signed main()
{
	n=read(),k=read();
	s=0,t=n*4+1;
	up(i,1,n)cin>>(c[i]+1);
	int l=0,r=n;
	int ans=0;
	down(i,n,0)
	{
		if(check(i))
		{
			cout<<i<<endl;
			return 0;
		}
	}
}

2021/4/12 17:13
加载中...