萌新袜子的网络流RE28pts惹。
查看原帖
萌新袜子的网络流RE28pts惹。
537997
Forgive_Me楼主2024/3/12 22:58

rt,下载数据本地AC,洛谷IDE也对,为什么。。。

记录

code:

#include<bits/stdc++.h>
#define int long long
#define inf 1e9
using namespace std;
struct Edge{
	int to,nxt,w;
}edge[1010];
int head[1010],dis[1010],cur[1010],n,m,s,t,cnt;
void add(int u,int v,int w)
{
	edge[cnt].nxt=head[u];
	edge[cnt].to=v;
	edge[cnt].w=w;
	head[u]=cnt++;
}
bool bfs()
{
	memset(dis,0,sizeof(dis));
	queue<int> q;
	q.push(s);
	cur[s]=head[s];
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=head[x];~i;i=edge[i].nxt)
		{
			int y=edge[i].to;
			if(dis[y]||!edge[i].w||y==s) continue;
			cur[y]=head[y];
			dis[y]=dis[x]+1;
			q.push(y);
		}
	}
	if(dis[t]) return true;
	else return false;
}
int nt[1010],fst[1010];
int dfs(int x,int flow)
{
	if(x==t) return flow;
	for(int &i=cur[x];~i;i=edge[i].nxt)
	{
		int y=edge[i].to;
		int k=flow;
		if(dis[y]==dis[x]+1&&edge[i].w>0)
		{
			k=min(k,edge[i].w);
			int res=dfs(y,k);
			if(res!=0)
			{
				nt[x]=y;
				if(x!=s) fst[y-n]=1;
				edge[i].w-=res;
				edge[i^1].w+=res;
				return res;
			}
		}
	}
	return 0;
}

void print()
{
	for(int i=1;i<=n;i++)
	{
		int x=i;
		if(!fst[x])
		{
			cout<<x<<" ";
			while(nt[x]!=t&&nt[x])
			{
				cout<<nt[x]-n<<" ";
				x=nt[x]-n;
			}
			cout<<'\n';
		}
	}
}
signed main()
{
	memset(head,-1,sizeof(head));
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v;
		add(u,v+n,1);
		add(v+n,u,0);
	}
	s=0,t=2*n+1;
	for(int i=1;i<=n;i++) add(s,i,1),add(i,s,0),add(i+n,t,1),add(t,i+n,0);
	int qaq=0,ans=0;
	while(bfs()!=0)
		while(qaq=dfs(s,inf)) ans+=qaq;
	print();
	cout<<n-ans;
}
2024/3/12 22:58
加载中...