蒟蒻求调 回复必关
查看原帖
蒟蒻求调 回复必关
772368
Wind_love楼主2024/3/5 12:53

dinic卡死了

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t,head[211000],level[220102],tot=1,vis[200012],maxflow=0,xiao[1201],fa[1293];
int u[221123],v[210203],w[212023],edge[212023],mid,now[212002];
struct jd{
	int w,v,nxt;
}a[211000];
void add(int u,int v,int w){
	a[++tot].v=v;
	a[tot].nxt=head[u];
	a[tot].w=w;
	head[u]=tot;
}
queue<int> q;
bool bfs(){
	memset(level,0,sizeof(level));
	while(!q.empty())q.pop();
	level[1]=1;
	q.push(1);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=a[i].nxt){
			int y=a[i].v,z=a[i].w;
			if(level[y]||!edge[i]){
				continue;
			}
			q.push(y);
			now[y]=head[y];
			level[y]=level[x]+1;
			if(y==n)return 1;
		}
	}
	return 0;
}
int dfs(int u,int ll){
	if(u==n)return ll;
	int ans1=ll,i;
	for(i=now[u];ans1&&i;i=a[i].nxt){
		int y=a[i].v,z=a[i].w; 
		if((level[y]==level[u]+1)&&edge[i]&&z<=mid){
			int zxl=dfs(y,min(ll,z));
			if(!zxl){
				level[y]=0;
			}
			edge[i]-=zxl;
			edge[i^1]+=zxl;
			ans1-=zxl;
		}
	}
	now[u]=i;
	return ll-ans1;
}
int dinic(){
	int p;
	while(bfs()){
		while(p=dfs(1,1e9)){
			maxflow+=p;
		}
	}
	return maxflow;
}
signed main(){
	cin>>n>>m>>t;
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i]>>w[i];
		add(u[i],v[i],w[i]);
		add(v[i],u[i],w[i]);
	}
	int l=1,r=1e6+1,ans=-1;
	while(l<=r){
		memset(edge,1,sizeof(edge));
		mid=l+r>>1;
		if(dinic()>=t)r=mid-1,ans=mid;
		else l=mid+1;
	}
	cout<<ans;
	return 0;
}
2024/3/5 12:53
加载中...