uva 11354 - Bond(树链剖分)

本文详细介绍了使用最小生成树和树链剖分解决Bond问题的算法实现,包括数据结构设计、算法步骤及代码实现,旨在帮助读者理解和掌握该问题的求解方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:uva 11354 - Bond

题目大意:给定一张图,每次询问两个节点路径上进过边的危险值的最大值的最小值。

解题思路:首先建立最小生成数,然后根据这棵树做树链剖分。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
const int maxn = 50005;
const int INF = 0x3f3f3f3f;

struct Edge {
    int u, v, w;
    Edge (int u = 0, int v = 0, int w = 0) { set(u, v, w); }
    void set(int u, int v, int w) {
        this->u = u;
        this->v = v;
        this->w = w;
    }
    friend bool operator < (const Edge& a, const Edge& b) {
        return a.w < b.w;
    }
}ed[maxn * 2];

int N, M, Q, ne, f[maxn], first[maxn], jump[maxn * 2], val[maxn];
int id, idx[maxn], top[maxn], far[maxn], son[maxn], dep[maxn], cnt[maxn];
vector<Edge> vec;

inline int getfar(int x) {
    return x == f[x] ? x : f[x] = getfar(f[x]);
}

inline void add_Edge (int u, int v, int w) {
    ed[ne].set(u, v, w);
    jump[ne] = first[u];
    first[u] = ne++;
}

void dfs (int u, int pre, int d) {
    far[u] = pre;
    dep[u] = d;
    son[u] = 0;
    cnt[u] = 1;

    for (int i = first[u]; i + 1; i = jump[i]) {
        int v = ed[i].v;
        if (v == pre)
            continue;
        dfs(v, u, d + 1);
        cnt[u] += cnt[v];
        if (cnt[son[u]] < cnt[v])
            son[u] = v;
    }
}

void dfs (int u, int rot) {
    top[u] = rot;
    idx[u] = ++id;
    if (son[u])
        dfs(son[u], rot);
    for (int i = first[u]; i + 1; i = jump[i]) {
        int v = ed[i].v;
        if (v == far[u] || v == son[u])
            continue;
        dfs(v, v);
    }
}

#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << 2], rc[maxn << 2], s[maxn << 2];

inline void pushup(int u) {
    s[u] = max(s[lson(u)], s[rson(u)]);
}

void build (int u, int l, int r) {
    lc[u] = l;
    rc[u] = r;

    if (l == r) {
        s[u] = val[l];
        return;
    }

    int mid = (l + r) / 2;
    build(lson(u), l, mid);
    build(rson(u), mid + 1, r);
    pushup(u);
}

int query(int u, int l, int r) {
    if (l <= lc[u] && rc[u] <= r)
        return s[u];
    int mid = (lc[u] + rc[u]) / 2, ret = 0;
    if (l <= mid)
        ret = max(ret, query(lson(u), l, r));
    if (r > mid)
        ret = max(ret, query(rson(u), l, r));
    return ret;
}

void init () {
    int u, v, w;
    ne = id = 0;
    vec.clear();
    memset(first, -1, sizeof(first));
    for (int i = 1; i <= N; i++)
        f[i] = i;

    for (int i = 0; i < M; i++) {
        scanf("%d%d%d", &u, &v, &w);
        vec.push_back(Edge(u, v, w));
    }
    sort(vec.begin(), vec.end());
    for (int i = 0; i < vec.size(); i++) {
        int p = getfar(vec[i].u);
        int q = getfar(vec[i].v);
        if (p == q)
            continue;
        add_Edge(vec[i].u, vec[i].v, vec[i].w);
        add_Edge(vec[i].v, vec[i].u, vec[i].w);
        f[p] = q;
    }

    dfs(1, 0, 0);
    dfs(1, 1);
    for (int i = 0; i < N - 1; i++) {
        int t = i * 2;
        u = (dep[ed[t].u] < dep[ed[t].v] ? ed[t].v : ed[t].u);
        val[idx[u]] = ed[t].w;
    }
    build(1, 1, N);
}

int solve (int u, int v) {
    int p = top[u], q = top[v], ret = 0;
    while (p != q) {
        if (dep[p] < dep[q]) {
            swap(p, q);
            swap(u, v);
        }
        ret = max(ret, query(1, idx[p], idx[u]));
        u = far[p];
        p = top[u];
    }
    if (u == v)
        return ret;
    if (dep[u] > dep[v])
        swap(u, v);
    ret = max(ret, query(1, idx[son[u]], idx[v]));
    return ret;
}

int main () {
    int cas = 0;
    while (scanf("%d%d", &N, &M) == 2) {
        if (cas++)
            printf("\n");

        init();

        int u, v;
        scanf("%d", &Q);
        while (Q--) {
            scanf("%d%d", &u, &v);
            printf("%d\n", solve(u, v));
        }
    }
    return 0;
}
<think>嗯,用户想了解关于NetworkManager绑定设备(nm-bond)的配置或问题。首先,我需要回忆NetworkManager中配置bonding的相关知识。记得bonding是将多个网络接口聚合为一个逻辑接口,提供冗余或提高带宽。NetworkManager支持通过nmcli或nmtui配置,可能需要用到不同的模式,比如balance-rr(mode 0)或者active-backup(mode 1)等。 然后,用户提供的引用有几个相关的命令和配置片段,比如引用3和4提到了使用bonding.py脚本和modprobe命令加载bonding模块,设置不同的模式。这可能涉及到内核模块的加载和参数设置。在NetworkManager中,可能需要用nmcli来创建bond接口,并指定从属接口和模式。 接下来,我需要确保回答符合系统级指令的要求,比如行内数学公式用$...$,独立公式用$$...$$,虽然这可能用不上数学公式,但要注意其他格式要求。使用中文回答,结构清晰,分步骤说明配置方法,并生成相关问题。 可能的问题点包括:如何创建bond设备,如何选择模式,如何设置IP地址,以及常见问题如接口不启动或模式不生效。需要结合引用中的信息,比如引用4提到mode=0和mode=1,miimon参数,这些在配置时可能需要用到。此外,引用2中的启用或禁用多播可能在某些情况下相关。 还要注意用户提到的nm-bond,即使用NetworkManager而不是传统的配置文件(如/etc/network/interfaces),所以重点放在nmcli命令上。例如,使用nmcli创建bond,添加从属接口,设置模式参数等。同时,需要指出常见问题排查步骤,比如检查日志,确认模块加载,从属接口状态等。 最后,生成的相关问题需要围绕bond配置的扩展,比如不同模式的区别、负载均衡配置、与VLAN的结合使用,以及故障排除方法。确保每个步骤都清晰,并且引用正确,比如引用中的配置示例可能需要标注引用标记。</think>### NetworkManager Bond设备配置指南 #### 一、基础配置步骤(使用nmcli) 1. **创建Bond接口** ```bash nmcli con add type bond con-name bond0 ifname bond0 bond.options "mode=802.3ad,miimon=100" ipv4.method manual ipv4.addresses 192.168.1.11/24 ``` - `mode=802.3ad`对应IEEE 802.3ad动态链路聚合[^3] - `miimon=100`表示每100ms检查链路状态[^4] 2. **添加从属接口** ```bash nmcli con add type bond-slave ifname eth0 master bond0 nmcli con add type bond-slave ifname eth1 master bond0 ``` 3. **激活配置** ```bash nmcli con up bond0 ``` #### 二、关键参数说明 | 参数 | 作用 | 示例值 | |------|------|--------| | mode | 绑定模式 | 802.3ad/active-backup | | primary | 主接口 | eth0[^4] | | miimon | 链路检测间隔 | 100ms | #### 三、常见问题排查 1. **接口未启动** ```bash journalctl -u NetworkManager -f # 查看实时日志 cat /proc/net/bonding/bond0 # 验证bond状态 ``` 2. **模式不生效** - 确认交换机配置匹配(如802.3ad需要LACP支持)[^1] - 检查内核模块加载:`lsmod | grep bonding` 3. **IP分配失败** ```bash nmcli device show bond0 # 检查IP配置 ip link set bond0 multicast on # 启用多播[^2] ``` #### 四、高级配置示例 ```bash nmcli con add type bond con-name bond1 ifname bond1 \ bond.options "mode=active-backup,primary=eth2,miimon=50" \ ipv4.gateway 192.168.1.1 ``` 此配置实现主备模式,eth2作为主接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值