用的是 Dinic 算法,哪位 dalao 帮忙看一下
#include <bits/stdc++.h>
using namespace std;
const int inf = 1 << 29,N = 50010,M = 300010;
int head[N], ver[M], edge[M], Next[M], d[N], now[N];
int n, m, s, t, tot, maxflow;
long long z;
queue<int> q;
void add(int x,int y,int z)
{
ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
ver[++tot] = x, edge[tot] = 0, Next[tot] = head[y], head[y] = tot;
}
bool bfs()
{
memset(d, 0, sizeof(d));
while(!q.empty()) q.pop();
q.push(s); d[s] = 1; now[s] = head[s];
while(q.size())
{
int x = q.front(); q.pop();
for(int i = head[x]; i; i = Next[i])
{
if(edge[i] && !d[ver[i]])
{
q.push(ver[i]);
now[ver[i]] = d[x] + 1;
if(ver[i] == t) return 1;
}
}
}
return 0;
}
int dinic(int x, int flow)
{
if(x == n) return flow;
int rest = flow, k;
for(int i = now[x]; i && rest; i = Next[i])
{
now[x] = i;
if(edge[i] && d[ver[i]] == d[x] + 1)
{
k = dinic(ver[i],min(rest,edge[i]));
if(!k) d[ver[i]] = 0;
edge[i] -= k;
edge[i ^ 1] += k;
rest -= k;
}
}
return flow - rest;
}
int main()
{
// freopen("T.in","r",stdin);
scanf("%d %d %lld", &n, &m, &z);
s = 1,t = n;
tot = 1;
for(int i = 1; i <= m; i++)
{
int x,y,z; scanf("%d %d %d", &x, &y, &z);
add(x,y,z);
add(y,x,0);
}
int flow = 0;
while(bfs())
while(flow = dinic(s,inf)) maxflow += flow;
if(maxflow == 0) puts("Orz Ni Jinan Saint Cow!");
else printf("%d %d\n", maxflow, z / maxflow + (z % maxflow != 0));
return 0;
}