给定一个n个节点m条边的带权有向图G,节点编号从1到n,图中可能有重边。
如果从节点u到节点v有一条权值为w的有向边,我们称这条边为(u,v,w)。
现在,你要将所有w为3的倍数的边(u,v,w)拆分,即删掉这条边,然后添加两条边(u,v,2w/3)和(v,u,w/3)。重复这个过程,直到所有边的权值都不是3的倍数。
图的定义如下:
// 邻接表中的边结构体
struct Edge {
int to; // 目标节点
int weight; // 权重
Edge(int t, int w) : to(t), weight(w) {}
};
// 邻接表中的节点结构体
struct Node {
int val; // 节点的值
vector<Edge> neighbors; // 邻居节点
Node(int v) : val(v) {}
};
// 图的邻接表结构体
struct Graph {
vector<Node> nodes; // 节点集合
Graph(int n) {
for (int i = 0; i <= n; i++) {
nodes.push_back(Node(i));
}
}
};
请问如何实现将所有w为3的倍数的边(u,v,w)拆分?