有关问题一个
查看原帖
有关问题一个
1332453
__Florie_楼主2024/8/14 20:39

玄关,最大流求条

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ldb long double

bool flo[210];
ll ans,inf=0x7f7f7f7f7f7f7f7f,f[210];
int n,m,x,a,b,c,head[210],tot=1,las[210];
struct node{
	int to,nxt; ll val;
}edge[2010];
void _add(int l,int r){
	edge[++tot].nxt=head[l]; edge[tot].to=r; edge[tot].val=c; head[l]=tot;
	edge[++tot].nxt=head[r]; edge[tot].to=l; edge[tot].val=0; head[r]=tot;
	return ;
}
bool bfs(){
	memset(flo,0,sizeof(flo));
	queue<int>qu; qu.push(1); flo[1]=1; f[1]=inf;
	while(!qu.empty()){
		int noww=qu.front(); qu.pop();
		for(int i=head[noww];i>-1;i=edge[i].nxt){
			if(edge[i].val==0) continue;
			int nex=edge[i].to;
			if(flo[nex]==1) continue;
			qu.push(nex); flo[nex]=1; las[nex]=i;
			f[nex]=min(f[noww],edge[i].val);
			if(nex==n) return 1;
		}
	}
	return 0;
}
void sum(){
	int x=n;
	while(x!=1){
		int noww=las[x];
		edge[noww].val-=f[n]; edge[noww^1].val+=f[n];
		x=edge[noww^1].to;
	}
	ans=ans+f[n]; return ;
}

signed main(){
	cin>>n>>m>>x;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&a,&b,&c);
		_add(a,b);
	}
	while(bfs()) sum();
	if(ans==0) cout<<"Orz Ni Jinan Saint Cow!";
	else if(x%ans==0) printf("%lld %lld",ans,x/ans);
	else printf("%lld %lld",ans,x/ans+1);
	return 0;
}
2024/8/14 20:39
加载中...