求修正
  • 板块灌水区
  • 楼主_ryyr_
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/5/8 21:44
  • 上次更新2023/11/4 23:31:52
查看原帖
求修正
414231
_ryyr_楼主2021/5/8 21:44

RT
二分图匹配

#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
int n,m,s,t;
struct Edge{
	int from,to;
	long long cap,flow;
};
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int cur[maxn];
int w[maxn];

void init()
{
	edges.clear();
	for(int i=0;i<100001;i++) G[i].clear();
}

void ins(int from,int to,long long w)
{
	edges.push_back((Edge){from,to,w,0});
	edges.push_back((Edge){to,from,0,0});
	int t=edges.size();
	G[from].push_back(t-2);
	G[to].push_back(t-1);
}

bool bfs()
{
	memset(vis,0,sizeof(vis));
	queue<int> q;
	q.push(s);
	vis[s]=true;
	w[s]=0;
	while(!q.empty())
	{
		int p=q.front();q.pop();
		for(int i=0;i<G[p].size();i++)
		{
			Edge& e=edges[G[p][i]];
			if(!vis[e.to]&&e.cap>e.flow)
			{
				q.push(e.to);
				w[e.to]=w[p]+1;
				vis[e.to]=true;
			}
		}
	}
	return vis[t];
}

long long dfs(int p,long long a)
{
	if(p==t||a==0) return a;
	long long f,flow=0;
	for(int& i=cur[p];i<G[p].size();i++)
	{
		Edge& e=edges[G[p][i]];
		if(w[e.to]==w[p]+1&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0)
		{
			e.flow+=f;
			flow+=f;
			a-=f;
			edges[G[p][i]^1].flow-=f;
			if(a==0) break;
		}
	}
	return flow;
}

long long maxflow()
{
	long long flow=0;
	while(bfs())
	{
		memset(cur,0,sizeof(cur));
		flow+=dfs(s,maxn*maxn);
	}
	return flow;
}

int main()
{
	int u,v,k;
	long long w;
	cin>>n>>k>>m;
	s=1;
	for(int i=1;i<=n;i++) ins(1,i,1);
	for(int i=n+1;i<=n+k;i++) ins(i,n+k+1,1);
	for(int i=0;i<m;i++)
	{
		cin>>u>>v;
		ins(u,v+n,1);
	}
	t=n+k+1;cout<<maxflow();
	return 0; 
	cout<<maxflow();
	return 0;
}

总是WA掉两个点

2021/5/8 21:44
加载中...