#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&∈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
TLE×16
提交记录
离散化,memset换for都已经试过了,无法改变 TLE 的结果