刚学OI,模板T飞,性别未知,求助
查看原帖
刚学OI,模板T飞,性别未知,求助
233298
OraclePi楼主2020/10/31 16:25

直角三角形,我上码开奖了;(好像只有我一个dinic T7个点的

#include<bits/stdc++.h>
#define rg register int 
using namespace std;
int N,cnt=1,head[4000],dep[4000];
int ans,flo;
struct node{
	int nxt;
	int to;
	int w;
}edge[4000];
void add_edge(int u,int v,int w)
{
	edge[++cnt].nxt=head[u];
	edge[cnt].to=v;
	edge[cnt].w=w;
	head[u]=cnt;
}
bool bfs()
{
	memset(dep,0,sizeof dep);
	queue< int >x;x.push(1);
	dep[1]=1;
	while(!x.empty())
	{
		int u=x.front();
		for(rg i=head[u];i;i=edge[i].nxt)
		{
			int v=edge[i].to;
			if(!dep[v]&&edge[i].w)
			{
				dep[v]=dep[u]+1;
				x.push(v);
			}
			if(v==26) return 1;
		}
		x.pop();
	}
	return 0;
}
int dinic(int u,int flow)
{
	if(u==26) return flow;
	int k;int res=flow;
	for(rg i=head[u];i&&res;i=edge[i].nxt)
	{
		int v=edge[i].to;
		if(dep[v]==dep[u]+1&&edge[i].w)
		{
			k=dinic(v,min(edge[i].w,res));
			if(!k) dep[v]=-1;
			edge[i].w-=k;
			edge[i^1].w+=k;
			res-=k;
		}
	}
	return flow-res;
}
signed main()
{
	scanf("%d",&N);
	while(N--)
	{
		char a,b;int w;
		cin>>a>>b>>w;
		add_edge(int(a)-'A'+1,int(b)-'A'+1,w);
		add_edge(int(b)-'A'+1,int(a)-'A'+1,0);
	}
	while(bfs())
	{
		while(flo=dinic(1,19260817)) ans+=flo;
	}
	printf("%d\n",ans);
	return 0;
}
2020/10/31 16:25
加载中...