网络流TLE求助
查看原帖
网络流TLE求助
590386
_LX_楼主2024/8/20 13:09
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T> inline void read(T& x) {
	x=0;T f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x=x*f;
	return;
}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){
	read(x);
	read(arg...);
}
template <typename T>void write(T x) {
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
}
template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){
	write(x);
	putchar(' ');
	write(arg...);
}
#define INF 2147483647
#define MAXN 600005
#define MAXM 1000005
namespace NetworkFlow{
	int tot,S,T;
	struct Edge{
		int s,t,z;
	}edge[MAXM<<1];
	int head[MAXN],nxt[MAXM],now[MAXN];
	int deep[MAXN];
	inline void input(int x,int y,int z){
		edge[tot].s=x;
		edge[tot].t=y;
		edge[tot].z=z;
		nxt[tot]=head[x];
		head[x]=tot;
		tot++;

		edge[tot].s=y;
		edge[tot].t=x;
		edge[tot].z=0;
		nxt[tot]=head[y];
		head[y]=tot;
		tot++;
	}
	inline bool bfs(){
		memset(deep,-1,sizeof(deep));
		memcpy(now,head,sizeof(now));
		queue<int>q;
		q.push(S);
		deep[S]=0;
		while(!q.empty()){
			int tp=q.front();
			q.pop();
			for(int i=head[tp];i!=-1;i=nxt[i]){
				int tt=edge[i].t;
				if(deep[tt]!=-1||edge[i].z<=0) continue;
				deep[tt]=deep[tp]+1;
				q.push(tt);
				if(tt==T) return 1;
			}
		}
		return 0;
	}
	inline int dfs(int x,int in){
		if(x==T) return in;
		int sum=0;
		for(int i=now[x];i!=-1&&in;i=nxt[i]){
			int tt=edge[i].t;
			if(edge[i].z>0&&deep[tt]==deep[x]+1){
				int k=dfs(tt,min(in,edge[i].z));
				if(!k) deep[tt]=-1;
				edge[i].z-=k;
				edge[i^1].z+=k;
				sum+=k;
				in-=k;
			}
			now[x]=i;
		}
		return sum;
	}
	inline int dinic(){
		int lans=0;
		while(bfs()) lans+=dfs(S,INF);
		return lans;
	}
	inline void pretreat(){
		memset(head,-1,sizeof(head));
		memset(nxt,-1,sizeof(nxt));
		memset(now,-1,sizeof(now));
		S=MAXN-2,T=MAXN-1;
	}
}
int n,tot;
signed main(){
	NetworkFlow::pretreat();
	read(n);
	tot=n;
	for(int i=0;i<n;i++){
		int x,y;
		read(x,y);
		NetworkFlow::input(NetworkFlow::S,i,1);
		NetworkFlow::input(i,x+n,1);
		NetworkFlow::input(i,y+n,1);
	}
	for(int i=0;i<=400000;i++) NetworkFlow::input(i+n,NetworkFlow::T,1);
	write(NetworkFlow::dinic());
	return 0;
}

AC×11 AC\times 11
TLE×16TLE \times 16
提交记录
离散化,memset换for都已经试过了,无法改变 TLETLE 的结果

2024/8/20 13:09
加载中...