马蜂极差的Dinic求救
查看原帖
马蜂极差的Dinic求救
227824
JK_LOVER楼主2020/7/27 08:35
#include<bits/stdc++.h>
using namespace std;
int read()
{
	int x = 0,f = 0;char ch = getchar();
	while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}
const int N = 800100;
struct Tree{
	
	int cnt,fa[N],val[N],head[N];
	struct E{int w,to,nxt;}e[N];
	vector<int> sons;
	void add(int x,int y,int w)
	{
		e[++cnt].nxt = head[x];
		e[cnt].to = y;
		e[cnt].w = w;
		head[x] = cnt; 
	}
	void dfs(int x,int f)
	{
		int son = 0;
		fa[x] = f;
		for(int i = head[x];i;i = e[i].nxt)
		{
			int y = e[i].to;
			val[y] = e[i].w;
//			cout<<y<<endl;
			if(y == f) continue;
			dfs(y,x);
			son++;
		}
		if(!son) sons.push_back(x);
	}
	Tree(){cnt = 0;}
}T;
struct Dinic{
	int head[N],cur[N],dis[N],s,t,n,cnt;
	struct E{int cap,flow,to,nxt;}e[N];
	void add(int x,int y,int cap)
	{
		e[++cnt].nxt = head[x];e[cnt].flow = 0;
		e[cnt].cap = cap;e[cnt].to = y;
		head[x] = cnt;
	}
	int Dfs(int x,int a,int t)
	{
//		cout<<x<<" "<<a<<" "<<t<<endl;
		if(a == 0 || x == t) return a;
		int f = 0,flow = 0;
		for(int i = cur[x];~i;i = e[i].nxt)
		{
			int y = e[i].to;
			if(dis[x] + 1 == dis[y] && ((f = Dfs(y,min(a,e[i].cap - e[i].flow),t))>0))
			{
				a -= f;
				flow += f;
				e[i].flow += f;
				e[i^1].flow -= f;
				cur[x] = i;
				if(a == 0) break;
 			}
		}
		return flow;
	}
	bool Bfs(int s,int t)
	{
		queue<int> Q;
		memset(dis,0,sizeof(dis));
		Q.push(s);dis[s] = 1;
		while(Q.size())
		{
			int x = Q.front();Q.pop();
//			cout<<x<<endl;
			for(int i = head[x];~i;i = e[i].nxt)
			{
				int y = e[i].to;
//				cout<<y<<endl;
				if(e[i].cap > e[i].flow && !dis[y])
				{
					dis[y] = dis[x] + 1;
					Q.push(y);
					if(dis[t])
					{
						return true;
					}
				}
			}	
		}
		return false;
	}
	Dinic(int n_,int s_,int t_)
	{
		n = n_;s = s_;t = t_;cnt = -1;
		memset(head,-1,sizeof(head));
	}
}MaxFlow=(Dinic){0,0,0};

int n,rt,s,t,maxflow = 0;

int main()
{
	n = read();rt = read();
	for(int i = 1;i < n;i++)
	{
		int a = read(),b = read(),val = read();
		T.add(a,b,val);
		T.add(b,a,val);
	}
	s = n+1;t = n+2;
	T.dfs(rt,t);
	MaxFlow.n = n + 2;MaxFlow.s = s;MaxFlow.t = t;
	for(int i = 0;i < T.sons.size();i++)
	{
//		cout<<i<<endl;
		int y = T.sons[i];
		cout<<y<<endl;
		MaxFlow.add(y,t,0x3f3f3f3f);
		MaxFlow.add(t,y,0);
	}
	MaxFlow.add(s,rt,0x3f3f3f3f);
	MaxFlow.add(rt,s,0);
	for(int i = 1;i <= n;i++)
	{
		if(i == rt) continue;
//		cout<<i<<" "<<T.fa[i]<<" "<<T.val[i]<<endl;
		MaxFlow.add(T.fa[i],i,T.val[i]);
		MaxFlow.add(i,T.fa[i],0);
	}
	while(MaxFlow.Bfs(s,t))
	{
//		cout<<MaxFlow.n<<endl;
		for(int i = 1;i <= t;i++) MaxFlow.cur[i] = MaxFlow.head[i];
		maxflow += MaxFlow.Dfs(s,0x3f3f3f3f,t);
		cout<<maxflow<<endl;
	}
	cout<<maxflow<<endl;
}
2020/7/27 08:35
加载中...