又见神秘问题
查看原帖
又见神秘问题
684131
VainSylphidElena楼主2024/12/31 14:16

solve(0,n) 全 T,solve(1,n) 100 分。

#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3fLL
using namespace std;
struct network{
	ll ps,pt,h[505],dep[505],cur[505],tot;
	struct edge{
		ll v,nxt,c,f;
	}e[10005];
	void init()
	{
		memset(h,0,sizeof h);
		tot = 1;
	}
	void reset()
	{
		for(ll i = 1;i <= tot;i++)
			e[i].f = 0;
	}
	void addedge(ll u,ll v,ll w)
	{
		e[++tot] = {v,h[u],w,0},h[u] = tot;
		e[++tot] = {u,h[v],w,0},h[v] = tot;
	}
	bool bfs()
	{
		queue<ll> q;
		memset(dep,0,sizeof dep),dep[ps] = 1,q.push(ps);
		while(!q.empty())
		{
			ll u = q.front();q.pop();
			for(ll i = h[u];i;i = e[i].nxt)
				if(!dep[e[i].v] && e[i].c > e[i].f)
					dep[e[i].v] = dep[u] + 1,q.push(e[i].v);
		}
		return dep[pt];
	}
	ll dfs(ll u,ll f)
	{
		if(u == pt || !f)
			return f;
		ll ret = 0;
		for(ll &i = cur[u];i;i = e[i].nxt)
		{
			ll v = e[i].v,d;
			if(dep[v] == dep[u] + 1 && (d = dfs(v,min(f - ret,e[i].c - e[i].f))))
			{
				ret += d,e[i].f += d,e[i ^ 1].f -= d;
				if(ret == f)
					return ret;
			}
		}
		return ret;
	}
	ll maxflow()
	{
		ll ans = 0;
		while(bfs())
		{
			for(ll i = 1;i <= 504;i++)
				cur[i] = h[i];
			ans += dfs(ps,INF);
		}
		return ans;
	}
}G;
struct Edge{
	ll v,w;
};
vector<Edge> E[505];
void adde(ll u,ll v,ll w)
{
	E[u].push_back({v,w});
	E[v].push_back({u,w});
}
ll T,n,m,q,t[505],t1[505],t2[505];
void solve(ll l,ll r)
{
	if(l == r)
		return;
	G.reset(),G.ps = t[l],G.pt = t[r];
	ll v = G.maxflow(),p1 = 0,p2 = 0;
	adde(t[l],t[r],v);
	for(ll i = l;i <= r;i++)
		if(G.dep[t[i]])
			t1[++p1] = t[i];
		else
			t2[++p2] = t[i];
	for(ll i = 1;i <= p1;i++)
		t[l + i - 1] = t1[i];
	for(ll i = 1;i <= p2;i++)
		t[l + p1 + i - 1] = t2[i];
	solve(l,l + p1 - 1),solve(l + p1,r);
}
ll ans[505][505],tot;
void dfs(ll u,ll f,ll g,ll v)
{
	ans[u][g] = v;
	for(auto i : E[u])
		if(i.v != f)
			dfs(i.v,u,g,min(i.w,v));
}
int main()
{
	scanf("%lld%lld",&n,&m);
	G.init();
	for(ll i = 1;i <= m;i++)
	{
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		G.addedge(u,v,w);
	}
	for(ll i = 0;i <= n;i++)
		t[i] = i;
	solve(1,n);
	tot = 0;
	for(ll i = 1;i <= n;i++)
		dfs(i,0,i,INF);
	scanf("%lld",&q);
	for(ll i = 1;i <= q;i++)
	{
		ll u,v;
		scanf("%lld%lld",&u,&v);
		printf("%lld\n",ans[u][v]);
	}
	return 0;
}
2024/12/31 14:16
加载中...