方法是spfa+超级源 代码如下:
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
bool st[N];
int D, P, C, F;
int d[N];
int e[N], ne[N], w[N], h[N], idx;
int ans, cnt[N];
queue<int> q;
void add(int a, int b, int m)
{
e[idx] = b, ne[idx] = h[a], w[idx] = m, h[a] = idx++;
}
bool spfa()
{
memset(d, -0x3f, sizeof d);
q.push(0);
st[0] = true;
d[0] = D;
while (!q.empty())
{
int j = q.front();
q.pop();
st[j] = false;
cnt[j]++;
if (cnt[j] > C)
return true;
for (int i = h[j]; i != -1; i = ne[i])
{
int t = e[i];
if (d[t] < d[j] + w[i])
{
d[t] = d[j] + w[i];
if (!st[t])
{
st[t] = true;
q.push(t);
}
}
}
}
return false;
}
int main()
{
memset(h, -1, sizeof h);
cin >> D >> P >> C >> F;
for (int i = 1; i <= P; i++)
{
int x, y;
cin >> x >> y;
add(x, y, D);
}
for (int i = 1; i <= F; i++)
{
int x, y, z;
cin >> x >> y >> z;
add(x, y, D - z);
}
for (int i = 1; i <= C; i++)
{
add(0, i, 0);
}
if (spfa())
cout << "orz" << endl;
else
{
for (int i = 1; i <= C; i++)
{
ans = max(ans, d[i]);
}
}
cout << ans << endl;
return 0;
}