40pts神异TLE求助
查看原帖
40pts神异TLE求助
609565
OtterZ楼主2023/10/29 10:22
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,m,a,b,w;
int eg[609][609];//边权
bitset<609>vis,dead;//bitset降空间
int dist[609];
int contract(int &s,int &t){//找s,t 
	vis=bitset<609>(0);
	memset(dist,0,sizeof(dist));
	int mincut,maxc,k;
	while(true){//小心死循环
		maxc=k=-1;
		for(int i=1;i<=n;i++){
			if(!dead[i]&&!vis[i]&&dist[i]>maxc){
				k=i;
				maxc=dist[i];
			}
		} 
		if(k==-1)return mincut;//弹出条件 
		vis[k]=true;
		s=t;
		t=k;
		mincut=maxc;
		for(int i=1;i<=n;i++){
			if(!dead[i]&&!vis[i])dist[i]+=eg[k][i];
		}
	}
	return mincut;
}
int Stoer_Wagner(){
	int mincut=2e9,s,t,tp=n-1;
	dead=bitset<609>(0);
	while(tp!=0){
		const int ans=contract(s,t);
		//printf("%d %d\n",s,t);
		if(ans<mincut)
			mincut=ans;//更新最小割
		dead[t]=true;
		if(mincut==0)return 0;//不连通 
		for(int i=1;i<=n;i++){//合并 
			if(!dead[i])eg[i][s]=eg[s][i]=eg[i][s]+eg[i][t];
		}
		tp--;
	}
	return mincut;
} 
/*int fa[609],sz[609];//并查集;
int find(int x){
	if(fa[x]==x)return x;
	else return fa[x]=find(fa[x]);
} 
void Union(int x,int y){
	int u=find(x),v=find(y);
	if(u==v)return;
	if(sz[u]>sz[v]){
		int t=u;
		u=v;
		v=t;
	}
	fa[u]=v;
	sz[v]+=sz[u];
}*/
int main(){
	scanf("%d %d",&n,&m);
	/*for(int i=1;i<=n;i++){
		fa[i]=i;
		sz[i]=1;
	}*/
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&a,&b,&w);
		//Union(a,b);
		eg[a][b]+=w,eg[b][a]+=w;
	}
	
	printf("%d\n",Stoer_Wagner());
	
	return 0;
}
2023/10/29 10:22
加载中...