社区讨论

P3381最小费用最大流求助EK+spfa73分

学术版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lzuo796a
此快照首次捕获于
2024/08/15 10:37
2 年前
此快照最后确认于
2024/08/15 10:37
2 年前
查看原帖
rt```cpp using namespace std; #include<bits/stdc++.h> #define ll long long ll n,m,s,t; ll u,v,w,c;const ll N=5e3+7; ll flag[N][N]; ll ans=0; ll kk=0;ll kkk=0; struct edge{ ll to,nxt,val,cost; }ed[N<<2];ll head[N];ll cntt=1; ll dis[N]; ll pre[N];ll vis[N]; void add_t(ll u,ll v,ll w,ll c){ ed[++cntt].nxt=head[u]; ed[cntt].to=v;ed[cntt].val=w;head[u]=cntt; ed[cntt].cost=c; ed[++cntt].nxt=head[v]; ed[cntt].to=u;ed[cntt].val=0; head[v]=cntt; ed[cntt].cost=-c; // cout<<"Sd/f"; } ll ds[N]; ll bfs(){ // cout<<"Df";
// cout<<"Sdf"; memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); memset(ds,0x3f,sizeof(ds)); queue q; q.push(s); vis[s]=1; ds[s]=0; dis[s]=0x3f3f3f3f3f3f3f3f; while(!q.empty()){ // cout<<"sf"; ll x=q.front(); q.pop(); vis[x]=0; for(ll i=head[x];i;i=ed[i].nxt){ if(ed[i].val==0) continue; ll v=ed[i].to; if(ds[v]>ds[x]+ed[i].cost){ ds[v]=ds[x]+ed[i].cost; dis[v]=min(dis[x],ed[i].val);
CPP
		pre[v]=i;
		if(!vis[v]){
			q.push(v);
			vis[v]=1;
		}
		
// cout<<"sdf"; }
CPP
	}
// cout<<"SDfsdf"; } return dis[t]>0;
} void upd(){ ll x=t; while(x!=s){ // cout<<"dsf"; int v=pre[x]; ed[v].val-=dis[t]; ed[v^1].val+=dis[t]; x=ed[v^1].to; // cout<<x<<'-'; // cout<<"SDF";
CPP
}
// cout<<"DFS"; kk+=dis[t];//cout<<"sdf"; kkk+=dis[t]*ds[t];
CPP
return;
} int main(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>m>>s>>t; for(int i=1;i<=m;i++){ cin>>u>>v>>w>>c;
CPP
	if(flag[u][v]==0){
		add_t(u,v,w,c);
		flag[u][v]=cntt;
	}else{
		ed[flag[u][v]-1].val+=w;
	}
}

while(bfs()!=0){
	upd();
}

cout<<kk<<' '<<kkk;
}
CPP

回复

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

正在加载回复...