WA90求调(WA on #6)
查看原帖
WA90求调(WA on #6)
610176
Jimmy1112楼主2024/11/4 21:55

code:

//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define rg register int
#define ll long long
#define fi first
#define se second
using namespace std;
typedef pair<int,int> pp;
//inline int rd()
//{
//	int s=0,w=1;
//	char ch=getchar();
//	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
//	while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
//	return s*w;
//}
//inline void wt(int x)
//{
//	if(x<0) putchar('-'),x=-x;
//	if(x>=10) wt(x/10);
//	putchar(x%10+'0');
//}
const int N=5110,M=15110;
int n,m,q;
struct edge
{
	int x,y,z;
}e[M];
int h[N],sum;
struct node
{
	int to,nxt,w;
}a[M<<2],at[N<<1];
int ht[N],sumt;
inline void addt(int x,int y,int z)
{
	sumt++;
	at[sumt].to=y;
	at[sumt].nxt=ht[x];
	at[sumt].w=z;
	ht[x]=sumt;
}
inline void add(int x,int y,int z)
{
	sum++;
	a[sum].to=y;
	a[sum].nxt=h[x];
	a[sum].w=z;
	h[x]=sum;
	sum++;
	a[sum].to=x;
	a[sum].nxt=h[y];
	a[sum].w=0;
	h[y]=sum;
}
int dis[N],b[N],head,tail,now[N];
int S,T;
inline int dfs(int x,int l)
{
	if(x==T) return l;
	int c=0;
	for(rg i=now[x];i&&l;i=a[i].nxt)
	{
		now[x]=i;
		int y=a[i].to;
		if(a[i].w&&dis[y]==dis[x]+1)
		{
			int u=dfs(y,min(a[i].w,l));
			if(u==0) dis[y]=2e9;
			l-=u;
			c+=u;
			if(i^1) a[i+1].w+=u,a[i].w-=u;
			else a[i-1].w+=u,a[i].w-=u;
		}
	}
	return c;
}
inline int dinic()
{
	sum=0;
	for(rg i=1;i<=n;i++) h[i]=0;
	for(rg i=1;i<=m;i++) add(e[i].x,e[i].y,e[i].z),add(e[i].y,e[i].x,e[i].z);
	int ans=0;
	while(1)
	{
		for(rg i=1;i<=n;i++) dis[i]=0,now[i]=h[i];
		head=0;
		tail=1;
		b[1]=S;
		dis[S]=1;
		while(head<tail)
		{
			head++;
			int x=b[head];
			for(rg i=h[x];i;i=a[i].nxt)
			{
				int y=a[i].to;
				if(a[i].w>0&&!dis[y])
				{
					dis[y]=dis[x]+1;
					tail++;
					b[tail]=y;
				}
			}
		}
		if(!dis[T]) return ans;
		ans+=dfs(S,2e9);
	}
}
int d[N];
int tmp1[N],tmp2[N];
inline void aa(int l,int r)
{
	if(l==r) return ;
	S=d[l];T=d[l+1];
	int u=dinic();
	addt(S,T,u);addt(T,S,u);
	int len1=0,len2=0;
	for(rg i=l;i<=r;i++)
	if(dis[d[i]]) tmp1[++len1]=d[i];
	else tmp2[++len2]=d[i];
	for(rg i=1;i<=len1;i++) d[l+i-1]=tmp1[i];
	for(rg i=1;i<=len2;i++) d[l+len1+i-1]=tmp2[i];
	aa(l,l+len1-1);
	aa(l+len1,r);
}
pp fa[N];
int dep[N];
inline void dfs1(int x)
{
	for(rg i=ht[x];i;i=at[i].nxt)
	{
		int y=at[i].to;
		if(y!=fa[x].fi)
		{
			fa[y]={x,at[i].w};
			dep[y]=dep[x]+1;
			dfs1(y);
		}
	}
}
int main()
{
//	freopen("","r",stdin);
//	freopen("","w",stdout);
	scanf("%d%d",&n,&m);
	for(rg i=1;i<=m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
	for(rg i=1;i<=n;i++) d[i]=i;
	aa(1,n);
	dfs1(1);
	scanf("%d",&q);
	while(q--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int ans=2e9;
		while(x!=y)
		{
			if(dep[x]>dep[y])
			{
				ans=min(ans,fa[x].se);
				x=fa[x].fi;
			}
			else
			{
				ans=min(ans,fa[y].se);
				y=fa[y].fi;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
2024/11/4 21:55
加载中...