https://www.luogu.org/problem/show?pid=1343#sub
最大流
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define INF 100000000
using namespace std;
int n,m,x;
int flow[10009];
struct P{
int f,id;
}pre[10009];
struct H{
int to,cap,rev;
};
vector <H> v[10009];
void add(int f,int t,int c)
{
v[f].push_back((H){t,c,v[t].size()});
v[t].push_back((H){f,0,v[f].size()-1});
}
queue <int> que;
int bfs(int s,int t)
{
while(!que.empty()) que.pop();
for(int i=1;i<=n;i++) pre[i].f=-1;
pre[s].f=0;
flow[s]=INF;
que.push(s);
while(!que.empty())
{
int k=que.front();
que.pop();
if(k==t) break;
for(int i=0;i<v[k].size();i++)
{
H &tmp=v[k][i];
if(tmp.to!=s&&tmp.cap>0&&pre[tmp.to].f==-1)
{
pre[tmp.to].f=k,pre[tmp.to].id=i;
flow[tmp.to]=min(tmp.cap,flow[k]);
que.push(tmp.to);
}
}
}
return pre[t].f==-1?-1:flow[t];
}
int maxflow(int s,int t)
{
int mflow=0,d;
while((d=bfs(s,t))!=-1)
{
mflow+=d;
int k=t;
while(k!=s)
{
int p=pre[k].f;
v[p][pre[k].id].cap-=d;
v[k][v[p][pre[k].id].rev].cap+=d;//利用反向边
k=p;
}
}
return mflow;
}
int main()
{
scanf("%d%d%d",&n,&m,&x);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
int p=maxflow(1,n);
if(!p) {
printf("Orz Ni Jinan Saint Cow!");
return 0;
}
int ans=0;
if(x%p!=0) ans=1;
printf("%d %d",p,ans+x/p);
return 0;
}