根据题意,求的是最大生成树。利用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. A1073. Scientific Notation

    Scientific notation is the way that scientists easily handle very large numbers or very small number ...

  2. 【POJ3694】Network

    题目大意:给定一个 N 个点,M 条边的无向图,支持 Q 次操作,每次可以向该无向图中加入一条边,并需要回答当前无向图中桥的个数. 题解:(暴力:Q 次 Tarjan) 先进行一次 Tarjan 求出 ...

  3. Chrome 下,重复使用 XMLHttpRequest进行Post数据时,遇到一个奇怪的问题

    var http_request; //在外面申明对象,主要为了在updatePage中使用     //无刷新更新内容 function post(url,parameter) {        i ...

  4. sscanf,sprintf 通过字符串与其它类型进行方便快捷的输入和输出

    http://c.biancheng.net/cpp/html/296.html 头文件:#include <stdio.h> sscanf()函数用于从字符串中读取指定格式的数据,其原型 ...

  5. 四个修改Docker默认存储位置的方法

    方法一.软链接 默认情况下Docker的存放位置为:/var/lib/docker 可以通过下面命令查看具体位置: sudo docker info | grep "Docker Root ...

  6. synchronized实现原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

  7. (cx_Oracle.DatabaseError) DPI-1047: 64-bit Oracle Client library cannot be loaded: "libclntsh.so: cannot open shared object file: No such file or directory"

    打开https://oracle.github.io/odpi/doc/installation.html 官方相关如下 Oracle Instant Client RPM¶ To run ODPI- ...

  8. SLT 优先队列 哈弗曼树最小带权路径

    与普通的队列不同,普通的队列是先进先出的,而优先队列出队的顺序不是先进先出,而是大(或者小)元素先出队,需要#include <queue> 成员函数 成员函数 作用 empty() 判断 ...

  9. C#实现虚拟控件列表显示100w个控件方法

    方法一: C#的FlowlayoutPanel添加一定数据量的控件后就会空白,通过虚拟列表方式可以解决这个问题. 1.创建一个包含ScrollPanel和滚动条的用户控件,定义一个List,添加控件时 ...

  10. ;(function ($, undefined){ })(jQuery); 的使用及说明

    对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用. 1.代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误. 2.匿名函数(func ...