神奇的TLE
查看原帖
神奇的TLE
225484
Kent999楼主2024/7/22 21:02
#include<bits/stdc++.h>
using namespace std;
int n1,n2,n3,m,st,ed;
struct edge{
	int v,w,nx;
}e[1000005];
int cnt=1,hd[510005],cur[510005];
void add(int u,int v,int w){
	e[++cnt]=edge{v,w,hd[u]};
	hd[u]=cnt;
}
int dis[510005];
bool bfs(){
	queue<int> q;q.push(st);
	memset(dis,0x3f,sizeof(dis));dis[st]=0;
	while(!q.empty()){
		int u=q.front();q.pop();
//		printf("%d\n",u);
		for(int i=hd[u];i;i=e[i].nx){
			int v=e[i].v;
//			printf(" %d %d %d %d\n",v,e[i].w,dis[u]+1,dis[v]);
			if(e[i].w<=0 || dis[v]<=dis[u]+1)continue;
			dis[v]=dis[u]+1;q.push(v);
		}
	}
	return dis[ed]!=0x3f3f3f3f;
}
int calc(int u,int La){
	if(u==ed)return La;
	int res=0;
	for(int i=cur[u];i;i=e[i].nx){
		cur[u]=i;
		int v=e[i].v;if(e[i].w<=0 || dis[v]!=dis[u]+1)continue;
		int p=calc(v,min(La,e[i].w));
		if(p==0)dis[v]=0x3f3f3f3f;
		e[i].w-=p;e[i^1].w+=p;
		res+=p;La-=p;
	}
	return res;
}
int dinic(){
	int res=0;
	while(bfs()){
		for(int i=1;i<=ed;i++)cur[i]=hd[i];
		res+=calc(st,1e9);
	}
//	for(int i=1;i<=ed;i++)printf("%d ",dis[i]);puts("");
	return res;
}
int main(){
	scanf("%d%d%d",&n1,&n2,&n3);
	st=n1+n1+n2+n3+1;ed=st+1;
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int u,v;scanf("%d%d",&u,&v);
		add(u,v+n1+n1,0);add(v+n1+n1,u,1);
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int u,v;scanf("%d%d",&u,&v);
		add(u+n1,v+n1+n1+n2,1);add(v+n1+n1+n2,u+n1,0);
	}
	for(int i=1;i<=n2;i++)add(st,n1+n1+i,1),add(n1+n1+i,st,0);
	for(int i=1;i<=n3;i++)add(n1+n1+n2+i,ed,1),add(ed,n1+n1+n2+i,0);
	for(int i=1;i<=n1;i++)add(i,i+n1,1),add(i+n1,i,0);
	printf("%d\n",dinic());
	return 0;
}

加边思路和第一篇题解一样

但是dinic莫名TLE了,对比了一下好像没啥问题

2024/7/22 21:02
加载中...