RE两个!
查看原帖
RE两个!
1188691
liyuan2023楼主2024/8/7 19:28
//mzh神力 
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200005,inf=1e9;
int n,m,s,ans,flow=0;
int head[N*20],ver[N*20],Next[N*20],edge[N*20],num=1;
int d[N*20],now[N*20];
queue<int> q;
void add(int u,int v,int w){
	ver[++num]=v,edge[num]=w,Next[num]=head[u],head[u]=num;
	ver[++num]=u,edge[num]=0,Next[num]=head[v],head[v]=num;
}
bool bfs(){
	memset(d,0,sizeof(d));
	d[1]=0;
	while(!q.empty()){
		q.pop();
	}
	q.push(1);
	d[1]=1;
	now[1]=head[1];
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=Next[i]){
			int v=ver[i];
			while(!d[v]&&edge[i]){
				q.push(v);
				now[v]=head[v];
				d[v]=d[u]+1;
				if(v==n){
					return true;
				}
			}
		}
	}
	return false;
}
int dinic(int u,int flow){
	if(u==n){
		return flow;
	}
	int k,i,res=flow;
	for(i=now[u];i&&res;i=Next[i]){
		int v=ver[i];
		if(edge[i]&&d[v]==d[u]+1){
			k=dinic(v,min(edge[i],res));
			if(!k){
				d[v]=0;
			}
			edge[i]-=k;
			edge[i^1]+=k;
			res-=k;
		}
	}
	now[u]=i;
	return flow-res;
}
signed main(){
	cin>>n>>m>>s;
	if(s==0){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	while(bfs()){
		while(flow=dinic(1,inf)){
			ans+=flow;
		}
	}
	cout<<ans<<" "<<(s-1)/ans+1;
    return 0;
}
2024/8/7 19:28
加载中...