MLE5个点,为啥
查看原帖
MLE5个点,为啥
203102
Diamiko楼主2021/10/31 15:26
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int head[100005],cur[100005],dep[100005],nxt[200005],to[200005],out[100005],root;
ll len[200005];
bitset<100005>vis;
int cnt=1;
inline void addEdge(int u,int v,ll w)
{
	nxt[++cnt]=head[u];
	to[cnt]=v;
	len[cnt]=w;
	head[u]=cnt;
}
int n,u,v;
ll w;
inline int read()
{
	int x(0);char c(0);
	for(;!isdigit(c);c=getchar());
	for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
	return x;
}
void write(ll x)
{
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
ll ans;
bool bfs()
{
	vis.reset();
	for(int i=1;i<=n+1;i++)
	{
		dep[i]=0;
		cur[i]=head[i];
	}
	queue<int>q;
	vis[root]=1;
	dep[root]=1;
	q.push(root);
	while(q.size())
	{
		int u=q.front();
		q.pop();
		for(int e=head[u];e;e=nxt[e])
		{
			int v=to[e];
			if(!dep[v]&&len[e])
			{
				dep[v]=dep[u]+1;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	return dep[n+1];
}
ll dfs(int u,ll in)
{
	if(u==n+1)return in;
	ll out=0;
	for(int e=cur[u];e;e=nxt[e])
	{
		cur[u]=e;
		int v=to[e];
		if(len[e]&&dep[v]==dep[u]+1)
		{
			ll res=dfs(v,min(len[e],in-out));
			if(res>0)
			{
				len[e]-=res;
				len[e^1]+=res;
				out+=res;
				if(in==out)break;
			}
		}
	}

	return out;
}
void dinic()
{
	while(bfs())
	{
		ans+=dfs(root,inf<<1);
	}
}
void DFS(int u,int father)
{
	bool flag=0;
	for(int e=head[u];e;e=nxt[e])
	{
		int v=to[e];
		if(v!=father)
		{
			flag=1;
			DFS(v,u);
			len[e^1]=0;
		}
	}
	if(!flag) addEdge(u,n+1,inf),addEdge(n+1,u,0);
}
int main()
{
	n=read();root=read();
	for(int i=1;i<n;i++)
	{
		u=read();v=read();w=read();
		addEdge(u,v,w);
		addEdge(v,u,w);
	}
	DFS(root,0);
	dinic();
	write(ans);
	return 0;
}
2021/10/31 15:26
加载中...