萌新求助网络流84pts
查看原帖
萌新求助网络流84pts
333574
Tyyyyyy楼主2022/2/10 20:33

rt,wa on test #11,#13。数据下下来是乱码。

#include<bits/stdc++.h>
using namespace std;
const int N=510,INF=2e9;
int n,a[N],dp[N],ans1;
int tot=1,h[N];
struct edge
{
	int v,w,nxt;
}e[N*N*4];
void add(int u,int v,int w)
{
	e[++tot]=(edge){v,w,h[u]};
	h[u]=tot;
}
int s,t,d[N];
bool bfs()
{
	memset(d,0,sizeof(d));
	queue<int>q;
	q.push(s),d[s]=1;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=h[u];i;i=e[i].nxt)
		{
			int v=e[i].v;
			if(e[i].w&&!d[v])
			{
				d[v]=d[u]+1,q.push(v);
				if(v==t)return 1;
			}
		}
	}
	return 0;
}
int dinic(int u,int flow)
{
	if(u==t)return flow;
	int rest=flow,k;
	for(int i=h[u];i&&rest;i=e[i].nxt)
	{
		int v=e[i].v;
		if(e[i].w&&d[v]==d[u]+1)
		{
			k=dinic(v,min(rest,e[i].w));
			if(!k)d[v]=0;
			rest-=k,e[i].w-=k,e[i^1].w+=k;
		}
	}
	return flow-rest;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]),dp[i]=1;
		for(int j=1;j<i;j++)
			if(a[j]<=a[i])dp[i]=max(dp[i],dp[j]+1);
		ans1=max(ans1,dp[i]);
	}
	printf("%d\n",ans1);
	if(ans1==1)
	{
		printf("%d\n",n);
		sort(a+1,a+n+1),n=unique(a+1,a+n+1)-a-1;
		printf("%d",n);
		return 0;
	}
	s=0,t=2*n+1;
	for(int i=1;i<=n;i++)add(i,i+n,1),add(i+n,i,0);
	for(int i=1;i<=n;i++)
	{
		if(dp[i]==1)add(s,i,INF),add(i,s,0);
		if(dp[i]==ans1)add(i+n,t,INF),add(t,i+n,0);
		for(int j=i+1;j<=n;j++)
			if(a[i]<=a[j]&&dp[i]+1==dp[j])add(i+n,j,1),add(j,i+n,0);
	}
	int flow,ans2=0;
	while(bfs())
		while(flow=dinic(s,INF))ans2+=flow;
	printf("%d\n",ans2);
	add(s,1,INF),add(1,s,0),add(1,n+1,INF),add(n+1,1,0);
	if(dp[n]==ans1)add(n+n,t,INF),add(t,n+n,0),add(n,n+n,INF),add(n+n,n,0);
	while(bfs())
		while(flow=dinic(s,INF))ans2+=flow;
	printf("%d",ans2);
	return 0;
}
2022/2/10 20:33
加载中...