98pts求助
查看原帖
98pts求助
648843
wdl_楼主2024/7/12 17:13
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf = LONG_LONG_MAX;
int n,m,s,t;
int cnt = 1,head[4005];
struct edge
{
	int u,v,w,next;
}e[400005];
void add(int u,int v,int w)
{
	cnt ++;
	e[cnt].u = u;
	e[cnt].v = v;
	e[cnt].w = w;
	e[cnt].next = head[u];
	head[u] = cnt;
}
int deep[4005];
bool bfs()
{
	memset(deep,0,sizeof(deep));
	queue<int>q;
	q.push(s);
	deep[s] = 1;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		for(int i = head[u];i;i = e[i].next)
		{
			if(deep[e[i].v] || !e[i].w)continue;
			deep[e[i].v] = deep[u] + 1;
			if(e[i].v == t)return 1;
			q.push(e[i].v);
		}
	}
	return 0;
}
int dfs(int u,int minn)
{
	if(u == t)return minn;
	int sum = 0;
	for(int i = head[u];i;i = e[i].next)
	{
		if(deep[u] + 1 != deep[e[i].v] || !e[i].w)continue;
		int now = dfs(e[i].v,min(minn,e[i].w));
		if(now)
		{
			sum += now;
			minn -= now;
			e[i].w -= now;
			e[i ^ 1].w += now;
			if(!minn)return sum;
		}
		else deep[e[i].v] = -1;
	}
	return sum;
}
bool bz[4005];
void print(int u)
{
	bz[u] = 1;
	for(int i = head[u];i;i = e[i].next)
	{
		if(e[i].w && !bz[e[i].v])print(e[i].v);
	}
}
int ans[2005];
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin >> n >> m >> s >> t;
	for(int i = 1;i <= n;i ++)
	{
		int c;
		cin >> c;
		add(i,i + n,c);
		add(i + n,i,0);
	}
	for(int i = 1;i <= m;i ++)
	{
		int u,v;
		cin >> u >> v;
		add(u + n,v,inf);add(v,u + n,0);add(v + n,u,inf);add(u,v + n,0);
	}
	while(bfs())
	{
		dfs(s,inf);
	}
	print(s);
	for(int i = 1;i <= n;i ++)
	{
	    if(bz[i] != bz[i + n])cout << i << ' ';
	}
	return 0;
}


2024/7/12 17:13
加载中...