1 solutions

  • 0
    @ 2025-11-5 17:27:23

    C++ :

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N = 100010, M = 500010;
    int head[N], val[M], len[M], nxt[M], mr;
    void ginit (int n)
    {
        mr = 0;
        for (int i = 0; i < n; i++) head[i] = -1;
    }
    void glink (int a, int b, int v)
    {
        val[mr] = b, len[mr] = v, nxt[mr] = head[a];
        head[a] = mr++;
    }
    const int mask = (1 << 22) - 1;
    int dist[N], que[mask + 1], cnt[N];
    bool inq[N];
    bool spfa (int source, int n)
    {
        int hd = mask + 1, tl = mask + 1; que[0] = source;
        for (int i = 0; i < n; i++) dist[i] = cnt[i] = 0;
        cnt[source] = 1, inq[source] = true;
        while (hd >= tl)
        {
            int cur = que[(hd--) & mask];
            inq[cur] = false;
            for (int p = head[cur]; p != -1; p = nxt[p])
            {
                int tar = val[p];
                if (dist[tar] < dist[cur] + len[p])
                {
                    dist[tar] = dist[cur] + len[p];
                    if (!inq[tar])
                    {
                        if (dist[tar] >= dist[que[hd & mask]]) que[(++hd) & mask] = tar;
                        else que[(--tl) & mask] = tar;
                        inq[tar] = true;
                    }
                    ++cnt[tar];
                    if (cnt[tar] >= n) return true;
                }
            }
        } return false;
    }
    int main ()
    {
       // freopen("gin.in", "r", stdin);
        //freopen("gin.out", "w", stdout);
        int n, k; scanf("%d %d", &n, &k); ++n;
        ginit(n);
        for (int i = 0; i < k; i++)
        {
            int x, y, c; scanf("%d %d %d", &c, &x, &y);
            if (c == 1) glink(x, y, 0), glink(y, x, 0);
            else if (c == 2) glink(x, y, 1);
            else if (c == 3) glink(y, x, 0);
            else if (c == 4) glink(y, x, 1);
            else glink(x, y, 0);
        }
        for (int i = 1; i < n; i++) glink(0, i, 1);
        if (spfa(0, n)) printf("-1\n");
        else
        {
            long long  ans = 0;
            for (int i = 1; i < n; i++) ans += dist[i];
            printf("%lld\n", ans);
        }
       // fclose(stdin);
       // fclose(stdout);
        return 0;
    }
    
    
    • 1

    Information

    ID
    18447
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By