// 随机攻击某一个节点 public static List <List <string> > RandomAttack(List <List <string> > data, int index) { // 由于data不能发生变化, 所以在这里要创建data的副本 List <List <string> > duplicateData = CommonUtils.getDuplicateData(data); // 攻击某个节点即在duplicateData中删除某个节点 GraphUtils.removeNode(duplicateData, index); return(duplicateData); }
// 计算每一个节点的coreness public static List <int> getNodeCoreness(List <List <string> > data) { // 若最大的度为m,则每一个节点的coreness必在0~m之间 List <int> allCoreness = new List <int>(); // 先初始化每一个节点的coreness for (int i = 0; i < data.Count; i++) { allCoreness.Add(0); } // 由于各个方法中关于data的传递全部是引用传递, // 而这里需要修改data中的内容,所以最好再开辟新的空间来存放一个data List <List <string> > duplicateData = CommonUtils.getDuplicateData(data); // 计算最大的度 int maxDegree = GraphUtils.getMaxDegree(duplicateData); // 判断节点是否被移除 Boolean isRemove; // 从度为0一直移除到度为maxDegree, 也就是从0-coreness图一直计算到k-coreness图 for (int k = 0; k <= maxDegree + 1; k++) { // 开始计算k-coreness图 List <int> allDegree = GraphUtils.getAllDegree(duplicateData); isRemove = false; for (int i = 0; i < duplicateData.Count; i++) { // 如果该点没有被移除 if (!(duplicateData[i][i].Equals("r"))) { if (allDegree[i] < k) { allCoreness[i] = k - 1; //移除该点, 这里仍需要传入该节点的标号 GraphUtils.removeNode(duplicateData, i + 1); // 各个点的度很可能已经发生变化,需要重新计算各个点的度 isRemove = true; break; } // 如果该点的度>=k else { allCoreness[i] = k; } } } if (isRemove) { k--; } } return(allCoreness); }
//计算子图 public static List <List <int> > getAllSubgraph(List <List <string> > data) { List <List <int> > allSubgraph = new List <List <int> >(); List <List <string> > duplicateData = CommonUtils.getDuplicateData(data); // 只要图不为空,就一直去找子图 while (!GraphUtils.isAllRemove(duplicateData)) { List <int> subgraph = GraphUtils.getSubgraph(duplicateData); allSubgraph.Add(subgraph); // 删除该子图中所有节点 foreach (int index in subgraph) { GraphUtils.removeNode(duplicateData, index); } } return(allSubgraph); }