请问为什么一直不对呢,怎么也找不出bug,求解谢谢
查看原帖
请问为什么一直不对呢,怎么也找不出bug,求解谢谢
665554
honglang36楼主2022/2/22 11:23
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <vector>
#include <cmath>
#include <cstring>
#include <stack>
#include <queue>
#include <string>
#include <map>
#include <cctype>

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

const int N = 2e4 + 10;
const int INF = 1e9;

struct Edge
{
    int from, to, cap, flow;  // cap為容量,flow為流量,當且僅當flow<cap時,該弧存在於參量網絡中,cap=0時,此邊為反向弧,此時flow<=0
};

struct ISAP
{
    int vSize, eSize, s, t;
    vector<Edge> edges;
    vector<int> G[N];
    bool vis[N];
    int dis[N];
    int cur[N];  // 當前弧下標
    int pre[N];  // 可增廣路上的上一條弧
    int num[N];  // 距離標號計數

    void init(int n)
    {
        vSize = n;
        eSize = 0;
        for (int i = 0; i < n; i++)
            G[i].clear();
        edges.clear();
    }

    void addEdge(int from, int to, int cap)
    {
        edges.push_back(Edge{from, to, cap, 0});
        edges.push_back(Edge{to, from, 0, 0});
        G[from].push_back(eSize++);
        G[to].push_back(eSize++);
    }

    void clearFlow()
    {
        for (int i = 0; i < eSize; i++)
            edges[i].flow = 0;
    }

    bool bfs()  // 構造分層網絡
    {
        memset(vis, 0, sizeof(vis));
        queue<int> q;
        q.push(t);
        vis[t] = true;
        dis[t] = 0;
        while (!q.empty())
        {
            int x = q.front();
            q.pop();
            for (int i = 0; i < (int)G[x].size(); i++)
            {
                Edge &e = edges[G[x][i] ^ 1];
                if (!vis[e.from] && e.cap > e.flow)
                {
                    vis[e.from] = true;
                    dis[e.from] = dis[x] + 1;
                    q.push(e.from);
                }
            }
        }
        return vis[s];
    }

    int augment()
    {
        int x = t, a = INF;
        while (x != s)
        {
            Edge &e = edges[pre[x]];
            a = min(a, e.cap - e.flow);
            x = edges[pre[x]].from;
        }
        x = t;
        while (x != s)
        {
            edges[pre[x]].flow += a;
            edges[pre[x] ^ 1].flow -= a;
            x = edges[pre[x]].from;
        }
        return a;
    }

    int maxflow(int s, int t)
    {
        this->s = s;
        this->t = t;
        int flow = 0;
        bfs();
        memset(num, 0, sizeof(num));
        for (int i = 0; i < vSize; i++)
            num[dis[i]]++;
        int x = s;
        memset(cur, 0, sizeof(cur));
        while (dis[s] < vSize)
        {
            if (x == t)
            {
                flow += augment();
                x = s;
            }
            int ok = 0;
            for (int i = cur[x]; i < (int)G[x].size(); i++)
            {
                Edge &e = edges[G[x][i]];
                if (e.cap > e.flow && dis[x] == dis[e.to] + 1)
                {
                    ok = 1;
                    pre[e.to] = G[x][i];
                    cur[x] = i;
                    x = e.to;
                    break;
                }
            }
            if (!ok)
            {
                int m = vSize - 1;
                for (int i = 0; i < (int)G[x].size(); i++)
                {
                    Edge &e = edges[G[x][i]];
                    if (e.cap > e.flow)
                        m = min(m, dis[e.to]);
                }
                if (--num[dis[x]] == 0)
                    break;
                num[dis[x] = m + 1]++;
                cur[x] = 0;
                if (x != s)
                    x = edges[pre[x]].from;
            }
        }
        return flow;
    }
};

ISAP solver;
string sp[N][2];
int tm[N][2];

int gett(int x)
{
    return x / 100 * 60 + x % 100;
}

int main()
{
    int n, m, lat;
    string st, ed;

    while (~scanf("%d", &n) && n)
    {
        cin >> st >> ed;
        scanf("%d%d", &lat, &m);
        lat = gett(lat);
        solver.init(m * 2 + 2);

        for (int i = 1; i <= m; i++)
        {
            cin >> sp[i][0] >> sp[i][1];
            int c;
            scanf("%d%d%d", &c, &tm[i][0], &tm[i][1]);
            tm[i][0] = gett(tm[i][0]);
            tm[i][1] = gett(tm[i][1]);
            solver.addEdge(i * 2, i * 2 + 1, c);
        }
        for (int i = 1; i <= m; i++)
        {
            if (tm[i][1] > lat)
                continue;
            if (sp[i][0] == st)
                solver.addEdge(0, i * 2, INF);
            if (sp[i][1] == ed)
                solver.addEdge(i * 2 + 1, 1, INF);
            for (int j = 1; j <= m; j++)
            {
                if (i == j || tm[j][1] > lat)
                    continue;
                if (sp[i][1] == sp[j][0] && tm[i][1] + 30 <= tm[j][0])
                    solver.addEdge(i * 2 + 1, j * 2, INF);
            }
        }
        printf("%d\n", solver.maxflow(0, 1));
    }

    return 0;
}


2022/2/22 11:23
加载中...