dinic 40 pts MLE 球跳
查看原帖
dinic 40 pts MLE 球跳
754310
Pepsee楼主2024/4/6 14:58

就是感觉没问题

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9+7;
inline int read(){
	int x=0,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();}
	return x*f;
}
void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
int n,m,e,s,t,ans;
int head[5114],tot = 1;
int dis[5114],now[5114];
struct node{
	int nex,to,w;
}edge[5000005];
void add(int x,int y,int w)
{
	edge[++tot].nex = head[x];
	edge[tot].to = y; edge[tot].w = w;
	head[x] = tot;
}
bool bfs()
{
	for (int i = 0; i <= n+m+1; i++) dis[i] = INF;
	queue<int> q;
	q.push(s);
	now[s] = head[s]; dis[s] = 0;
	while (!q.empty())
	{
		int u = q.front(); q.pop();
		for (int i = head[u]; i; i = edge[i].nex)
		{
			int v = edge[i].to,w = edge[i].w;
			if (w > 0 && dis[v] == INF)
			{
				now[v] = head[v];
				dis[v] = dis[u]+1;
				q.push(v);
				if (v == t) return 1;
			}
		}
	}
	return 0;
}
int dfs(int x,int inflow)
{
	if (x == t) return inflow;
	int k = 0,outflow = 0;
	for (int i = now[x]; i && inflow; i = edge[i].nex)
	{
		int v = edge[i].to,w = edge[i].w;
		now[x] = i;
		if (w > 0 || dis[v]==dis[x]+1)
		{
			k = dfs(v,min(w,inflow));
			if (!k) dis[v] = INF;
			edge[i].w -= k; edge[i^1].w += k;
			inflow -= k; outflow += k;
		}
	}
	return outflow;
}
signed main()
{
//	freopen("P3386_5.in","r",stdin);
//	freopen("1.out","w",stdout);
	n = read(); m = read(); e = read();
	s = 0; t = n+m+1;
	for (int i = 1; i <= n; i++)
		add(s,i,1),add(i,s,0);
	for (int i = n+1; i <= n+m; i++)
		add(i,t,1),add(t,i,0);
	for (int i = 1,u,v; i <= e; i++)
	{
		u = read(),v = read();
		if(u>n||v>m) continue;
		add(u+1,v+n+1,1); add(v+n+1,u+1,0);		
	}
	while (bfs()) ans += dfs(s,INF);
	write(ans);
	return 0;
}
2024/4/6 14:58
加载中...