火红的颜色覆盖了屏幕,唯一绿色的生机也不翼而飞(最小割wa10)
查看原帖
火红的颜色覆盖了屏幕,唯一绿色的生机也不翼而飞(最小割wa10)
299810
issue_is_fw楼主2020/8/24 20:01

标题是偷的

求大佬康康,不知怎么的爆零了

应该是在main函数里面出错的

因为这个模板拿去交[最小割树模板]是能过的

#include <bits/stdc++.h>
using namespace std;
const int inf=1e9;
const int maxn=1e5+10;
struct edge{
	int to,nxt,flow;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v,int flow)
{
	d[++cnt]=(edge){ v,head[u],flow },head[u]=cnt;
	d[++cnt]=(edge){ u,head[v],0},head[v]=cnt;
}
int dis[maxn],n,m;
bool bfs(int s,int t)
{
	for(int i=0;i<=n+1;i++)	dis[i]=0;
	dis[s]=1;
	queue<int>q; q.push( s );
	while( !q.empty() )
	{
		int u=q.front(); q.pop();
		for(int i=head[u];i;i=d[i].nxt )
		{
			int v=d[i].to;
			if( dis[v]==0&&d[i].flow )
			{
				dis[v]=dis[u]+1;
				if( v==t )	return true;
				q.push( v ); 
			}
		}
	}
	return false;
}
int dinic(int u,int t,int flow)
{
	if( u==t )	return flow;
	int res=flow;
	for(int i=head[u];i;i=d[i].nxt )
	{
		int v=d[i].to;
		if( dis[v]==dis[u]+1&&d[i].flow )
		{
			int temp=dinic(v,t,min(d[i].flow,res) );
			res-=temp;
			if( temp==0 )	dis[v]=0;
			d[i].flow-=temp;
			d[i^1].flow+=temp;
		}
		if( res==0 )	break;
	}
	return flow-res;
}
void init()
{
	for(int i=2;i<=cnt;i+=2)//撤流操作,复原上一次最大流的影响 
		d[i].flow+=d[i^1].flow,d[i^1].flow=0;
}
int maxflow(int s,int t)
{
	init();
	int ans=0;
	while( bfs(s,t) )	ans+=dinic(s,t,inf);
	return ans;
}
class GHT
{
	public:
		edge d[maxn];
		int head[maxn],cnt;
		int temp1[maxn],temp2[maxn],node[maxn];
		void add(int u,int v,int flow){
			d[++cnt]=(edge){ v,head[u],flow },head[u]=cnt;
			d[++cnt]=(edge){ u,head[v],flow },head[v]=cnt;
		}
		void build(int l,int r)
		{
			if( l>=r )	return;
			int x=node[l],y=node[l+1];//随便拉两个点跑最小割
			int cut = maxflow(x,y);
			add(x,y,cut);
			//去掉x和y,分成temp1和temp2两个集合
			int top1=0,top2=0;
			for(int i=l;i<=r;i++)
			{
				//最后一次bfs后有深度,说明s和这个点相连接
				if( dis[ node[i] ] )	temp1[++top1]=node[i];
				else	temp2[++top2]=node[i];	
			}
			for(int i=l;i<=l+top1-1;i++)	node[i]=temp1[i-l+1];
			for(int i=l+top1;i<=r;i++)	node[i]=temp2[i-top1-l+1]; 
			build(l,l+top1-1); build(l+top1,r);
		}
		int deep[maxn],fa[maxn][23],ans[maxn][23],log2n;
		void dfs(int x,int father)
		{
			fa[x][0]=father;
			deep[x]=deep[father]+1;
			for(int i=1;i<=log2n;i++)
			{
				fa[x][i]=fa[ fa[x][i-1] ][i-1];
				ans[x][i]=min( ans[x][i-1],ans[ fa[x][i-1] ][i-1]);
			}
			for(int i=head[x];i;i=d[i].nxt )
			{
				int v=d[i].to;
				if( v==father )	continue;
				ans[v][0]=d[i].flow;
				dfs(v,x);
			}
		}
		int query(int x,int y)
		{
			int zhi=inf;
			if( deep[x]<deep[y] )	swap(x,y);
			for(int i=log2n;i>=0;i-- )
				if( deep[ fa[x][i] ]>=deep[y] )
				{
					zhi=min(zhi,ans[x][i] );
					x=fa[x][i];
				}
			if( x==y )	return zhi;
			for(int i=log2n;i>=0;i-- )
				if( fa[x][i]!=fa[y][i] )
				{
					zhi=min( zhi,min( ans[x][i],ans[y][i] ) );
					x=fa[x][i],y=fa[y][i];
				}
			zhi=min( zhi,min( ans[x][0],ans[y][0] ));
			return zhi;
		}
}CUT;
void CUT_init()
{
	CUT.log2n=log2(n)+1;
	CUT.cnt=1;
	for(int i=1;i<=500;i++)	CUT.node[i]=i,CUT.head[i]=0,deep[i]=0;
	for(int i=1;i<=500;i++)
	for(int j=0;j<=20;j++)
		CUT.ans[i][j]=CUT.fa[i][j]=0;
	CUT.build(1,n);
	CUT.dfs(1,0);
}
int bridge[maxn],id;
int main()
{
	int T; cin >> T;
	while( T-- )
	{
		cin >> n >> m;
		for(int i=1;i<=m;i++)
		{
			int l,r,flow; cin >> l >> r >> flow;
			add(l,r,flow); add(r,l,flow);
		}
		CUT_init();
		for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			bridge[++id]=CUT.query(i,j);
		int q; cin >> q;
		while( q-- )
		{
			int x; cin >> x;
			x = upper_bound(bridge+1,bridge+1+id,x )-bridge-1;
			cout << x << '\n';
		}
		cout << '\n';
		id=0,cnt=1;
		for(int i=1;i<=n;i++)	head[i]=0;
		memset(bridge,0,sizeof(bridge));
	}
}
2020/8/24 20:01
加载中...