根据题意,求的是最大生成树。利用Kruskal算法,对边进行从大到小的顺序进行排序,然后再依次取出边加入结果集中。假设图有n个顶点,那么,当结果集中有n-1条边时,剩下的边的集合即为反馈边集。

 package org.xiu68.ch05.ex9;

 import java.util.ArrayList;
import java.util.Comparator; public class Ex5_21 { public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] edges=new int[][]{
{0,2,1,6},
{2,0,5,3},
{1,5,0,4},
{6,3,4,0}
};
ArrayList<String> vexs=new ArrayList<>();
for(int i=0;i<4;i++)
vexs.add("v"+i);
MGraph<String> m1=new MGraph<String>(4,4,edges,vexs);
m1.kruskal();
//运行结果
/*
(0,3):6
(1,2):5
(2,3):4
(1,3):3
(0,1):2
(0,2):1
*************************************
反馈边集为:
(1,3):3
(0,1):2
(0,2):1
*/
}
} //边类型
class Edge{
public int head; //头顶点序号
public int tail; //尾顶点序号
public int cost; //权值 public Edge(int head, int tail, int cost) {
super();
this.head = head;
this.tail = tail;
this.cost = cost;
}
} //邻接矩阵表示图
class MGraph<T> implements Comparator<Edge>{
public int vexNum; //顶点数量
public int edgeNum; //边数量
public ArrayList<T> vexs; //顶点表
public int[][] edges; //邻接矩阵 public MGraph(int vexNum, int edgeNum, int[][] edges, ArrayList<T> vexs) {
this.vexNum = vexNum;
this.edgeNum = edgeNum;
this.edges = edges;
this.vexs=vexs;
} //返回反馈边集
public void kruskal(){
ArrayList<Edge> eds=new ArrayList<>();
//初始化边集数组
for(int i=0;i<edges.length;i++){
for(int j=i+1;j<edges[i].length;j++){
if(edges[i][j]==0)
continue;
Edge e=new Edge(i,j,edges[i][j]);
eds.add(e);
}
} //对边集数组进行排序
eds.sort(this); for(int i=0;i<eds.size();i++)
System.out.println("("+eds.get(i).head+","+eds.get(i).tail+"):"+eds.get(i).cost); ArrayList<Edge> resultSet=new ArrayList<>(); //存放反馈边集
int[] components=new int[vexNum]; //并查集
for(int i=0;i<vexNum;i++)
components[i]=i; int k=0,j=0;
while(k<vexNum-1){ int h1=eds.get(j).head;
int t1=eds.get(j).tail;
int com1=components[h1];
int com2=components[t1]; //在不同的并查集
if(com1!=com2){
k++;
for(int i=0;i<vexNum;i++){
if(components[i]==com2)
components[i]=com1;
}
}else{
//反馈边集
resultSet.add(eds.get(j));
}
j++;
} //找到n-1条边后,剩下的边也属于反馈边集
for(int i=j;i<eds.size();i++)
resultSet.add(eds.get(i)); System.out.println("*************************************");
System.out.println("反馈边集为:");
for(int i=0;i<resultSet.size();i++)
System.out.println("("+resultSet.get(i).head+","+resultSet.get(i).tail+"):"+resultSet.get(i).cost);
} @Override
public int compare(Edge e1, Edge e2) {
// TODO Auto-generated method stub
//按从大到小排序
if(e1.cost<e2.cost)
return 1;
else
return -1;
}
}

Ex 5_21 无向图G=(V,E)的反馈边集..._第九次作业的更多相关文章

  1. ubuntu64位系统编译时头文件找不到的问题(可以查看g++ -v路径,设置export C_INCLUDE_PATH,CPLUS_INCLUDE_PATH)

    今天编译webrtc时出现以下错误: ninja -C out/Debug Allninja: Entering directory `out/Debug'[1/6] CXX obj/talk/app ...

  2. Ex 4_10 给定一个有向图G=(V,E),其中边...(bellman-ford算法的应用).._第十二次作业

    在bellman-ford算法中,循环n-1(n为顶点个数)次可以找出从源点到其他顶点的最多n-1条边的最短路径,若循环k次则可以找出从源点到其他顶点的最多k条边的最短路径. package org. ...

  3. 封装一些常用的js工具函数-不定时更新(希望大家积极留言,反馈bug^_^)

    /*华丽------------------------------------------------------------------------------------------------ ...

  4. Ex3_7无向图二部图_十一次作业

    (a) 从图中的某个顶点做深度优先遍历,并将不同层的顶点标记为红黑两种颜色,使得每条树边的两个顶点的颜色都不相同,如果遇到一条回边并且两个顶点的颜色都相同则说明图不是二部图. (b)如果存在一个长度为 ...

  5. 【NLP】前戏:一起走进条件随机场(一)

    前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...

  6. 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法

    1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Kruskal 最小生成树算法

    对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...

  9. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

随机推荐

  1. 【洛谷P3469】BLO

    题目大意:给定 N 个点,M 条边的联通无向图,求出对于每个点来说,将与这个点相连的所有边都去掉后,会少多少个联通的点对 (x,y). 题解:连通性问题从 DFS 树的角度进行考虑.对于 DFS 树当 ...

  2. 【洛谷P1717】钓鱼

    题目大意:给定 N 个位置,每个位置有一个答案贡献值,在一个位置加了一次该位置的答案贡献值之后,该值会减掉一部分,从一个位置移动到另一个位置需要花费一定的时间,问:给定 M 单位的时间,如何移动使得答 ...

  3. 1.C和C++的区别

    C和C++的区别  C语言语法简单,但使用不易  C++语法非常庞大复杂,但使用方便,更注重的是它的编程思想(面向对象). 一.第一个C++程序  1.文件扩展名   C++源文件扩展名 .cpp,C ...

  4. Shell变量的取用、删除、取代与替换

    <<鸟哥的私房菜>> 注意: 通配符适用的地方:shell命令行或者shell脚本中 正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则. 在文本过滤工具里,都是 ...

  5. checkbox用图片替换原始样式,并实现同样的功能

    1.结构: <div class="box1"> <input/> <div class="box2"> <img / ...

  6. C#控件及常用设计整理

    1.窗体  1.常用属性  (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体.  (2) WindowState属性:  用来获取或设置窗体的窗口状态. 取值有三 ...

  7. Python基础【day01】:Hello World程序(二)

    本节内容 安装 Hello World程序 变量 一.Python安装 windows 1 2 3 4 5 6 7 1.下载安装包     https://www.python.org/downloa ...

  8. Java IO笔记

    第一:File类(主要获取文件名,判断文件是否存在,创建或者删除文件) 举个例子,代码如下: import java.io.File; public class Main{ public static ...

  9. NTT模板

    NTT(快速数论变换)用到的各种素数及原根: https://blog.csdn.net/hnust_xx/article/details/76572828 NTT多项式乘法模板 #include&l ...

  10. 我的vim插件配置

    set nocompatible " be iMproved, required filetype off " required " set the runtime pa ...