zoukankan      html  css  js  c++  java
  • P5651 基础最短路练习题

    注意到简单环异或为(0),等于没有啊(bushi

    整个生成树。

    跑个树上(xor)(operatorname{dfs}或operatorname{bfs})均可。这里的时间复杂度显然(mathcal{O}(n + m))?(bushi

    反正能过就行

    遂默写 (operatorname{Kruskal})

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 5;
    int n, m, q;
    
    struct edge
    {
        int from, to, w;
    };
    
    struct edge2
    {
        int to, w;
    };
    
    vector<edge> g;
    vector<edge2> g2[N];
    
    int f[N], Xor[N];
    
    int find(int x)
    {
        if (x ^ f[x])
            f[x] = find(f[x]);
        return f[x];
    }
    
    void Kruskal(void)
    {
        int tot = 0;
        for (int i = 1; i <= n; i++)
            f[i] = i;
        for (int i = 0; i < m * 2; i++)
        {
            int u = g[i].from, v = g[i].to, w = g[i].w;
            // printf("u = %d,v = %d,w = %d
    ", u, v, w);
            int fu = find(u), fv = find(v);
            if (fu ^ fv)
            {
                f[fu] = fv;
                g2[u].push_back({v, w});
                g2[v].push_back({u, w});
                // printf("neww : u = %d,v = %d,w = %d
    ", u, v, w);
                if (++tot == n - 1)
                    break;
            }
        }
        return;
    }
    
    void dfs(int x, int fa, int totxor)
    {
        Xor[x] = totxor;
        // printf("x = %d,totxor = %d
    ", x, totxor);
        for (int i = 0; i < g2[x].size(); i++)
        {
            int v = g2[x][i].to;
            if (v != fa)
            {
                dfs(v, x, totxor ^ g2[x][i].w);
            }
        }
        return;
    }
    
    int main(void)
    {
        scanf("%d%d%d", &n, &m, &q);
        for (int i = 1; i <= m; i++)
        {
            int u, v, w;
            scanf("%d%d%d", &u, &v, &w);
            g.push_back({u, v, w});
            g.push_back({v, u, w});
        }
        Kruskal();
        dfs(1, 0, 0);
        while (q--)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            printf("%d
    ", Xor[x] ^ Xor[y]);
        }
        return 0;
    }
    
    //Kr + dfs
    
  • 相关阅读:
    20161101学习笔记
    20161031学习笔记
    20161028学习笔记
    20161027学习笔记
    ReentrantLock Condition
    ReentrantLock 重入锁
    CountDownLatch用法与原理
    场景化解释 AQS原理
    Atomic
    多线程工具类
  • 原文地址:https://www.cnblogs.com/luyiming123blog/p/P5651.html
Copyright © 2011-2022 走看看