bzoj2115 Xor(线性基)

题目链接

解题思路

  本题的重点就是把环从路径中拿出来单独考虑,如果给你一条1到n的路径,让你往路径上加环,使得结果最大的话,相当于求几个数的子序列的最大异或和,很明显可以用线性基来做。
  我们在dfs过程中存一下1号点到当前点的异或值dis[i],如果遇见了一个环,那么根据异或的性质(a xor b xor a = b),将这条边连接的两个点的dis和边权异或一下就能得到这个环的权值,然后把它加入线性基里就行了。

代码

const int maxn = 1e5+10;
const int maxm = 1e6+10;
ll dis[maxn]; 
bool vis[maxn];
vector<P> e[maxn];
vector<ll> s;
void insert(ll t) {
    for (auto v : s) t = min(t, t^v);
    for (auto &v: s) v = min(v, v^t);
    if (t) s.push_back(t);
}
void dfs(int u, int p) {
    vis[u] = 1;
    for (auto v : e[u]) {
        if (v.y==p) continue;
        if (!vis[v.y]) {
            dis[v.y] = dis[u]^v.x;
            dfs(v.y, u);
        }
        else insert(dis[v.y]^v.x^dis[u]);
    }
}
int main() {
    IOS;
    int n, m; cin >> n >> m;
    for (int i = 1, a, b; i<=m; ++i) {
        ll c; cin >> a >> b >> c;
        e[a].push_back({c, b});
        e[b].push_back({c, a});
    }
    dfs(1, 0);
    ll ans = dis[n];
    for (auto t : s) ans = max(ans, ans^t);
    cout << ans << endl;
    return 0;
}
posted @   shuitiangong  阅读(24)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
点击右上角即可分享
微信分享提示