第九个测试点不过,求大佬解惑
  • 板块P2648 赚钱
  • 楼主EXUS_116
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/5 19:04
  • 上次更新2024/3/5 20:43:41
查看原帖
第九个测试点不过,求大佬解惑
854068
EXUS_116楼主2024/3/5 19:04

方法是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;
}

2024/3/5 19:04
加载中...