社区讨论

!蒟蒻的P3329最小割树模版经性感猫娘调教无果仍保龄,求条

灌水区参与者 7已保存回复 15

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
15 条
当前快照
1 份
快照标识符
@lzcfo4m2
此快照首次捕获于
2024/08/02 16:19
2 年前
此快照最后确认于
2024/08/02 16:29
2 年前
查看原帖
标题党罢了,但是真的不知道错哪了
CPP
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int T,n,m,q,s,t,z,ans,sum;
struct edge
{
	int to,next,dis;
}e[1000005];
int h[500005],cnt=1;
void add(int x,int y,int d)
{
	e[++cnt].to=y;
	e[cnt].dis=d;
	e[cnt].next=h[x];
	h[x]=cnt;
}
void Add(int x,int y,int d)
{
	add(x,y,d);
	add(y,x,0);
}
int dis[500005],now[500005];
bool bfs(int s,int t)
{
	queue<int>q;
	for(int i=1;i<=n;i++)dis[i]=inf;
	q.push(s),dis[s]=1,now[s]=h[s];
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=h[x];i;i=e[i].next)
			if(dis[e[i].to]==inf&&e[i].dis)
			{
				q.push(e[i].to);
				now[e[i].to]=h[e[i].to];
				dis[e[i].to]=dis[x]+1;
				if(e[i].to==t)return 1;
			}
	}
	return 0;
}
int dfs(int t,int x,int f)
{
	if(x==t)return f;
	int k,res=0;
	for(int i=now[x];i&&f;i=e[i].next)
	{
		now[x]=i;
		if(e[i].dis&&dis[e[i].to]==dis[x]+1)
		{
			k=dfs(t,e[i].to,min(f,e[i].dis));
			if(k==0)dis[e[i].to]=inf;
			e[i].dis-=k,e[i^1].dis+=k;
			res+=k,f-=k;
		}
	}
	return res;
}
int x,y,d,v[1000005];
int dinic(int s,int t)
{
	ans=0;
	for(int i=2;i<=cnt;i++)
		e[i].dis=v[i];
	while(bfs(s,t))
		ans+=dfs(t,s,inf);
	return ans;
}
int f[500005];
int dist[505][505];
int t1[500005],t2[500005];
void build(int l,int r)
{
	if(l>=r)return;
	s=f[l],t=f[l+1];
	dist[s][t]=dist[t][s]=dinic(s,t);
	int cnt1=0,cnt2=0;
	for(int i=l;i<=r;i++)
		(dis[f[i]]^inf?t1[++cnt1]=f[i]:t2[++cnt2]=f[i]);
	for(int i=1;i<=cnt1;i++)f[i+l-1]=t1[i];
	for(int i=1;i<=cnt2;i++)f[l+cnt1+i-1]=t2[i];
	build(l,l+cnt1-1),build(l+cnt1,r);
	for(int i=l;i<l+cnt1;i++)for(int j=l+cnt1;j<=r;j++)
		dist[f[i]][f[j]]=dist[f[j]][f[i]]=min(min(dist[s][t],dist[f[i]][f[j]]),min(dist[f[i]][s],dist[t][f[j]]));
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--)
	{
		memset(dist,0x3f,sizeof(dist));
		cin>>n>>m,cnt=1;
		for(int i=1;i<=n;i++)
			h[i]=now[i]=0,f[i]=i;
		for(int i=1;i<=m;i++)
		{
			cin>>x>>y>>d;
			Add(x,y,d);
			Add(y,x,d);
		}
		for(int i=2;i<=cnt;i++)v[i]=e[i].dis;
		build(1,n);
		cin>>q;
		while(q--)
		{
			cin>>z,sum=0;
			for(int i=1;i<=n;i++)
				for(int j=i+1;j<=n;j++)
					if(dist[i][j]<=z)sum++;
			cout<<sum<<endl;
		}
		cout<<endl;
	}
	return 0;
}
@skella_ 性感猫娘再帮我调调

回复

15 条回复,欢迎继续交流。

正在加载回复...