记录编号 431298 评测结果 AAAAAAAAAA
题目名称 血帆海盗 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 C++ 运行时间 0.322 s
提交时间 2017-07-31 15:54:49 内存使用 2.91 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 100005
#define maxx 400005
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{	char c=getchar();int x=0;
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x;
}
struct road{int en,cap,nex;}ro[maxx];
int ans,mk,n,m,num,hea[maxn],tail,sta[maxn],bel[maxn],sum,dis[maxn],low[maxn],dfn[maxn],inf=0xfffffff,st,ed;
bool inst[maxn];
void add(int x,int y,int z)
{	ro[num].en=y;ro[num].cap=z;ro[num].nex=hea[x];hea[x]=num++;
	ro[num].en=x;ro[num].cap=0;ro[num].nex=hea[y];hea[y]=num++;
}
void tarjan(int x)
{	low[x]=dfn[x]=++mk;
	sta[++tail]=x;inst[x]=1;
	for(int i=hea[x];i!=-1;i=ro[i].nex)
	{	if(!ro[i].cap) continue;
		int v=ro[i].en;
		if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]);
		else if(inst[v]) low[x]=min(low[x],dfn[v]);
	}
	if(low[x]==dfn[x])
	{	int u;sum++;
		while(1)
		{	u=sta[tail--];inst[u]=0;
			bel[u]=sum;
			if(u==x) break;
		}
	}
}
bool bfs(int s,int t)
{	queue<int>q;mem(dis,0);
	q.push(s);dis[s]=1;
	while(!q.empty())
	{	int u=q.front();q.pop();
		for(int i=hea[u];i!=-1;i=ro[i].nex)
		{	int v=ro[i].en;
			if(!dis[v]&&ro[i].cap){dis[v]=dis[u]+1;q.push(v);if(v==t) return 1;}
		}
	}
	return 0;
}
int dfs(int x,int y,int z)
{	if(x==y) return z;
	int f,tmp=0;
	for(int i=hea[x];i!=-1;i=ro[i].nex)
	{	int v=ro[i].en;
		if((dis[v]==dis[x]+1)&&ro[i].cap)
		{	f=dfs(v,y,min(z-tmp,ro[i].cap));
			if(!f){dis[v]=0;continue;}
			ro[i].cap-=f;ro[i^1].cap+=f;tmp+=f;
			if(tmp==z) return tmp;
		}
	}
	return tmp;
}
void dinic(int s,int t){while(bfs(s,t)) ans+=dfs(s,t,inf);}
int fff()
{	freopen("bloodsail.in","r",stdin);
	freopen("bloodsail.out","w",stdout);
	mem(hea,-1);int x,y,edge;
	n=read();m=read();edge=n>>1;ed=n+1;
	for(int i=1;i<=edge;i++) add(st,i,1),add(i+edge,ed,1);
	for(int i=1;i<=m;i++) x=read(),y=read(),add(x,y,1);
	dinic(st,ed);
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	for(int i=1;i<=edge;i++)
		for(int j=hea[i];j!=-1;j=ro[j].nex)
			if(!ro[j].cap&&bel[ro[j].en]==bel[i]&&ro[j].en) ans--;
	printf("%d",ans);
	return 0;
}
int ttt=fff();
int main(){;}