题意:
解析:
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
using namespace std;
const int maxn = 100 + 10;
const int maxm = 5000;
const LL inf = 1LL << 60;
const double eps = 1e-8;
int n, m;
struct Edge
{
int fr, to;
LL cost;
int flow, cap;
int next;
} e[maxm * 4 + 10];
int u[maxm], v[maxm], w[maxm];
int first[maxn];
int p[maxn];
int edgeNum;
void Init()
{
edgeNum = 0;
memset(first, -1, sizeof(first));
}
void addEdge(int f, int t, LL w, int cap)
{
e[edgeNum].fr = f;
e[edgeNum].to = t;
e[edgeNum].cost = w;
e[edgeNum].cap = cap;
e[edgeNum].flow = 0;
e[edgeNum].next = first[f];
first[f] = edgeNum++;
e[edgeNum].fr = t;
e[edgeNum].to = f;
e[edgeNum].cost = -w;
e[edgeNum].cap = 0;
e[edgeNum].flow = 0;
e[edgeNum].next = first[t];
first[t] = edgeNum++;
}
int D, K;
void EK()
{
queue<int> q;
LL d[maxn];
LL c, f;
c = f = 0;
while (1)
{
///bellman-ford start
bool inq[maxn];
for (int i = 0; i <= n; i++)
d[i] = (i == 0) ? 0 : inf;
memset(inq, false, sizeof(inq));
memset(p, -1, sizeof(p));
q.push(0);
while (!q.empty())
{
int u = q.front();
q.pop();
inq[u] = false;
for (int i = first[u]; i != -1; i = e[i].next)
{
int v = e[i].to;
if (e[i].flow < e[i].cap && d[u] + e[i].cost < d[v])
{
d[v] = d[u] + e[i].cost;
p[v] = i;
if (!inq[v])
{
inq[v] = true;
q.push(v);
}
}
}
}
///bellman-ford end
if (d[n] == inf)
break;
int a = 0x3f3f3f3f;
for (int u = p[n]; u != -1; u = p[e[u].fr])
{
a = min(a, e[u].cap - e[u].flow);
}
for (int u = p[n]; u != -1; u = p[e[u].fr])
{
e[u].flow += a;
e[u^1].flow -= a;
}
c += d[n] * a;
f += a;
}
if (f == D)
printf("%lld\n",c);
else
printf("Impossible.\n");
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
while (~scanf("%d%d", &n, &m))
{
Init();
for (int i = 0; i < m; i++)
{
scanf("%d%d%lld", &u[i], &v[i], &w[i]);
}
scanf("%d%d", &D, &K);
addEdge(0, 1, 0, D);
for (int i = 0; i < m; i++)
{
addEdge(u[i], v[i], w[i], K);
addEdge(v[i], u[i], w[i], K);
}
EK();
}
return 0;
}