关于网络流为什么会T
查看原帖
关于网络流为什么会T
136965
ASD_JYJ楼主2022/3/13 20:59

第三个点网络大小4e5,T飞掉了

#include<bits/stdc++.h>

using namespace std;

const int N =2e5+10;
const int M =1e6+10;
const int INF=INT_MAX;

int source,endg,n,m,cnt,tot_L,tot_R,tot;
int cur[M],dep[M],t[N],La[N],Ra[N],cntp,plL[N],plR[N],tot_num[N];
struct edge
{
	int nxt,flow,opp;
};
vector<edge>G[M]; 
struct node
{
	int nu,line;
};
vector<node>nu_begin[N];
vector<int>nu_end[N];
vector<int>waypl[N];
string printS[2]={"L","R"};

inline int read()
{
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x;
}

inline void add_new_edge(int u,int v,int flow)
{
	G[u].push_back(edge{v,flow,G[v].size()});
	G[v].push_back(edge{u,0,G[u].size()-1});
}

inline bool find_rest_graph()
{
	memset(dep,0,sizeof(dep));
	dep[source]=1;
	cur[source]=0;
	queue<int>q;
	q.push(source);
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		for(auto i:G[now])
		{
			int flow=i.flow;
			int nxt=i.nxt;
			if(!dep[nxt]&&flow)
			{
				dep[nxt]=dep[now]+1;
				cur[nxt]=0;
				if(nxt==endg)
					return true;
				q.push(nxt);
			}
		}
	}
	return false;
}


inline int find_extended_path(int now,int limit)
{
	if(now==endg)
		return limit;
	int out_flow=0;
	for(int i=cur[now];out_flow<limit&&i<G[now].size();++i)
	{
		int nxt=G[now][i].nxt;
		int flow=G[now][i].flow;
		cur[now]=i;
		if(dep[nxt]==dep[now]+1&&flow)
		{
			int k=find_extended_path(nxt,min(flow,limit-out_flow));
			if(!k)
				dep[nxt]=0;
			out_flow+=k;
			G[now][i].flow-=k;
			G[nxt][G[now][i].opp].flow+=k;
		}
	}
	return out_flow; 
}

inline int Dinic()
{
	int addtional_flow,Max_flow=0,cnt=0;
	while(find_rest_graph())
	{
		
		while(addtional_flow=find_extended_path(source,INF))
			Max_flow+=addtional_flow;
	}
	return Max_flow;
}

inline void print(bool flag)
{
	if(!flag)
	{
		printf("NO");
		exit(0);
	}
	else 
	{
		printf("YES\n");
		for(int i=1;i<=n;++i)
		{
			bool ans[nu_begin[i].size()+1];
			int cnt=-1;
			bool f=0;
			int p=-1;
			for(int j=0;j<nu_begin[i].size();++j)
			{
				int k=nu_begin[i][j].line;
				if((j==nu_begin[i].size()-1||nu_begin[i][j].nu!=nu_begin[i][j+1].nu))
				{	
					if((j-p)&1)
					{
						cnt++;
						if(!G[La[i]][waypl[i][cnt]].flow)
							ans[k]=0;
						else 
							ans[k]=1;
					}	
					else
					{
						f=!f;
						ans[k]=f;
					}
					p=j;
				}
				else
				{
					f=!f;
					ans[k]=f;
				}
			}
			for(int j=0;j<nu_begin[i].size();++j)
				cout<<printS[ans[j]];
			puts("");
		}
	}
}

inline void build_graph()
{
	for(int i=1;i<=n;++i)
	{
		if(!nu_end[i].size())
			continue;
		La[i]=++cntp;
		Ra[i]=++cntp;
	}
	for(int i=1;i<=n;++i)
	{
		tot+=nu_end[i].size();
		for(int j:nu_end[i])
		{
			tot_num[j]++;
			if(!plL[j])
			{
				plL[j]=++cntp;
				plR[j]=++cntp;
			}
			add_new_edge(La[i],plL[j],1);
			waypl[i].push_back(G[La[i]].size()-1);
			add_new_edge(Ra[i],plR[j],1);
		}
	}
	tot_L=++cntp;
	tot_R=++cntp;
	source=++cntp;
	endg=++cntp;
	for(int i=1;i<=n;++i)
	{
		if(!nu_end[i].size())
			continue;
		add_new_edge(source,La[i],nu_end[i].size()>>1);
		add_new_edge(source,Ra[i],nu_end[i].size()>>1);
	}
	for(int i=1;i<=n;++i)
	{
		if(!tot_num[i])
			continue;
		if(tot_num[i]&1)
			print(0);
		add_new_edge(plL[i],tot_L,tot_num[i]>>1);
		add_new_edge(plR[i],tot_R,tot_num[i]>>1);
	}
	add_new_edge(tot_L,endg,tot>>1);
	add_new_edge(tot_R,endg,tot>>1);
}

inline bool cmp(node a,node b)
{
	return a.nu<b.nu;
}

inline void dispersed()
{
	sort(t+1,t+cnt+1);
	int len=unique(t+1,t+cnt+1)-t-1;
	for(int i=1;i<=n;++i)
	{
		for(int j=0;j<nu_begin[i].size();++j)
		{
			nu_begin[i][j].nu=lower_bound(t+1,t+len+1,nu_begin[i][j].nu)-t;
		}
		sort(nu_begin[i].begin(),nu_begin[i].end(),cmp);
	}
	for(int i=1;i<=n;++i)
	{
		int p=-1;
		for(int j=0;j<nu_begin[i].size();++j)
		{
			if((j==nu_begin[i].size()-1||nu_begin[i][j].nu!=nu_begin[i][j+1].nu)&&(j-p)&1)
				nu_end[i].push_back(nu_begin[i][j].nu),p=j;
		}
	}
}

int main()
{
	n=read();
	for(int i=1;i<=n;++i)
	{
		int sum;
		sum=read();
		for(int j=0;j<sum;++j)
		{
			int number;
			number=read();
			t[++cnt]=number;
			nu_begin[i].push_back(node{number,j});
		}
	}
	dispersed();
	build_graph();
	if(Dinic()<tot)
		print(0);
	else 
		print(1);
}
  
2022/3/13 20:59
加载中...