记录编号 158756 评测结果 AAAAAAAAAA
题目名称 血帆海盗 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 1.644 s
提交时间 2015-04-17 13:58:14 内存使用 17.77 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
 
#define N 300010
#define INF 0x3f3f3f3f
 
using namespace std;
 
struct edge{
	int x,to,cap;
}E[N<<1],R[N];
 
int g[N],n,m,totE=1,S,T,h[N],ans,cnt;
int cur[N],dfsn[N],low[N],tott,belong[N];
bool v[N];
 
void ade(int x,int y){
	E[++totE]=(edge){y,g[x],1}; g[x]=totE;
	E[++totE]=(edge){x,g[y],0}; g[y]=totE;
}
 
queue<int> q;
 
bool bfs(){
	#define p E[i].x
	memset(v,0,sizeof(v));
	q.push(S); v[S]=h[S]=1;
	while(!q.empty()){
		int x=q.front(); q.pop();
		for(int i=g[x];i;i=E[i].to)
			if(!v[p] & E[i].cap){
				h[p]=h[x]+1; v[p]=1; q.push(p);
			}
	}
	return v[T];
}
 
int dinic(int x,int flow){
	#define p E[i].x
	if(x==T||!flow) return flow;
	int f=0;
	for(int i=g[x];i;i=E[i].to){
		if(h[p]!=h[x]+1||!E[i].cap) continue;
		int tp=dinic(p,min(flow,E[i].cap));
		flow-=tp; f+=tp;
		E[i].cap-=tp; E[i^1].cap+=tp;
		if(!flow) break;
	}
	if(!f) h[x]=-1; return f;
}
 
void buildgraph(){
	S=n+1; T=n+2;
	for(int i=1;i<=(n>>1);i++) ade(S,i),ade(i+(n>>1),T);
	for(int i=1;i<=m;i++) ade(R[i].x,R[i].to);
	while(bfs()) ans+=dinic(S,INF);
}

stack<int> st;

void dfs(int x){
	#define p E[i].x
	dfsn[x]=low[x]=++tott;
	st.push(x); v[x]=1;
	for(int i=g[x];i;i=E[i].to){
		if(!E[i].cap) continue;
		if(!dfsn[p]){
			dfs(p);
			low[x]=min(low[x],low[p]);
		}
		else if(!belong[p]){
			low[x]=min(low[x],dfsn[p]);
		}
	}
	if(low[x]==dfsn[x]){
		cnt++;
		while(1){
			int t=st.top(); st.pop();
			belong[t]=cnt;
			if(t==x) break;
		}
	}
}

int main(){
	freopen("bloodsail.in","r",stdin);
	freopen("bloodsail.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d",&R[i].x,&R[i].to);
	buildgraph();
	memset(v,0,sizeof(v));
	for(int i=1;i<=n;i++) if(!dfsn[i]) dfs(i);
	#define p E[i].x
	for(int x=1;x<=(n>>1);x++){
		for(int i=g[x];i;i=E[i].to){
			if(E[i].cap||p==S) continue;
			if(belong[p]==belong[x]) ans--;
		}
	}
	printf("%d\n",ans);
	fclose(stdin); fclose(stdout);
	return 0;
}