根据题意,求的是最大生成树。利用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. 基本数据类型对象包装(Integer等)

    基本数据类型 包装类 byte Byte short             Short int   Integer long Long boolean Boolean float          ...

  2. idea tomcat上传图片,无法显示的问题解决

    真是浪费时间啊,之前eclipse下的tomcat 去webapps下找就行了,这倒好,idea下根本没有. 我上传的目录建在项目中的static中了,upload文件夹,上传到这里肯定是找不到了的: ...

  3. gcc/g++

    $gcc -g -Wall -ansi -pedantic main.cpp -lstdc++ -std=c++11 -lpthread -o xmain

  4. js对象之window和document区别

    window是整个页面的全局环境,而document可以理解为整个页面这个最大的元素(整个dom树) window: 可以看到window下面有很多变量 document: 可见document是整个 ...

  5. Python 爬虫的工具列表 附Github代码下载链接

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  6. 函数和常用模块【day06】:configparser模块(七)

    本节内容 1.简述 2.配置文件格式 3.创建配置文件 4.读取配置文件 5.增删该查语法 一.简述 在很多情况下,我们都需要修改配置文件,但是,有些配置文件,如mysql数据库的配置文件怎么修改呢? ...

  7. python---ORM之SQLAlchemy(1)

    定义一个类,ORM(对象关系映射)将这个类转换为sql语句,使用pymysql进行执行 一,底层处理 使用engine/connectionpooling/dialect进行数据库操作,engine使 ...

  8. 缓存穿透、雪崩、热点与Redis

    (拼多多问:Redis雪崩解决办法) 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防 ...

  9. HDU - 3521 An easy Problem(矩阵快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=3521 题意 对于矩阵A,求e^A的值. 分析 这个定眼一看好像很熟悉,就是泰勒展开,可惜自己的高数已经还给老师了 ...

  10. Java编程思想 学习笔记11

    十一.持有对象  通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...