有向图的拓扑排序
来源:互联网 发布:手机学生模式软件 编辑:程序博客网 时间:2024/05/16 00:43
package 图;
/*
图有两个数组来存储这种关系,一是存储顶点的。一个是存储顶点的关系的。
有向图的优先级排序。实例:课程的优先关系。
有两个步骤:
1.找到一个没有后继结点
2.从图中删除这个节点,在列表的前面插入顶点的标记
重复操作1,2直到所有的元素被删除。
*/
class TVertex
{
public char label;
public boolean wasVisited;
public TVertex(char c)
{
label=c;
wasVisited=false;
}
}
class Tgraph
{
private final int MAX_VERS=20;
private TVertex[] TArray;
private int[][] adjMat;
private int nElems;
private char[] sortedArray;
public Tgraph()
{
nElems=0;
TArray=new TVertex[MAX_VERS];
adjMat=new int[MAX_VERS][MAX_VERS];
for(int i=0;i<MAX_VERS;i++)
for(int j=0;j<MAX_VERS;j++)
adjMat[i][j]=0;
sortedArray=new char[MAX_VERS];
}
public void addVer(char c)
{
TArray[nElems++]=new TVertex(c);
}
public void addEdge(int start,int end)
{
adjMat[start][end]=1;
}
public void topo()
{
int sum=nElems;
while(nElems>0)
{
//得到最后一个节点
int currentVertex=noSuccessors();
if(currentVertex==-1)
{
System.out.println("ERROR:graph has cycles");
return;
}
//在元素数组中删除内容
sortedArray[nElems-1]=TArray[currentVertex].label;
//在关系数组中删除它所在的行和列
delete(currentVertex);
}
System.out.println("da yin");
for(int i=0;i<sum;i++)
System.out.print(sortedArray[i]);
System.out.println();
}
//得到最后一个节点
public int noSuccessors()
{
boolean isEdge;
//row是起始点,col是终点
for(int row=0;row<nElems;row++)
{
isEdge=false;
for(int col=0;col<nElems;col++)
{
if(adjMat[row][col]>0)
{
isEdge=true;
break;
}
}
if(!isEdge)
return row;
}
return -1;
}
public void delete(int key)
{
if(key!=nElems-1)
{
for(int j=key;j<nElems;j++)
{
TArray[j]=TArray[j+1];
}
for(int row=key;row<nElems;row++)
moveRowUp(row,nElems);
for(int col=key;col<nElems;col++)
moveColUp(col,nElems);
}
nElems--;
}
public void moveRowUp(int row,int length)
{
for(int col=0;col<length;col++)
adjMat[row][col]=adjMat[row+1][col];
}
public void moveColUp(int row,int length)
{
for(int col=0;col<length;col++)
adjMat[row][col]=adjMat[row][col+1];
}
}
public class topo
{
public static void main(String[] args)
{
Tgraph graph=new Tgraph();
graph.addVer('A');
graph.addVer('B');
graph.addVer('C');
graph.addVer('D');
graph.addVer('E');
graph.addVer('F');
graph.addVer('G');
graph.addVer('H');
graph.addEdge(0,3);
graph.addEdge(0,4);
graph.addEdge(1,4);
graph.addEdge(2,5);
graph.addEdge(3,6);
graph.addEdge(4,6);
graph.addEdge(5,7);
graph.addEdge(6,7);
graph.topo();
}
}
- 有向图的拓扑排序
- 有向图的拓扑排序
- 有向图的拓扑排序C++
- 图论-有向图的拓扑排序
- 有向图的拓扑排序
- 有向图的拓扑排序~TopologicalSort
- 有向图的拓扑排序
- 有向图的拓扑排序
- 有向图的拓扑排序
- 有向图--拓扑排序
- 数据结构之图-有向图的拓扑排序(8)
- 有向图的拓扑排序与项目安排
- C++编程练习(12)----“有向图的拓扑排序“
- 对输入的有向图进行拓扑排序
- 利用DFS求解有向图的拓扑排序
- 有向图(4)--基于深度优先的拓扑排序
- 有向图的拓扑排序——基于邻接矩阵
- 数据结构与算法之有向图的拓扑排序
- 用Lucene索引数据库
- WebService大讲堂之Axis2(9):编写Axis2模块(Module)
- 十大数学建模方法
- 最小生成树
- 修改资源类,轻松访问资源
- 有向图的拓扑排序
- SVN服务器的搭建
- Makefile的语法及写法(续)
- NET实用设计模式:观察者模式(Observer)
- aspx 到 html 最简单方法
- forms验证如此简单
- WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息
- 使用C#实现网站用户登录
- 异步IO框架实现之EPOLL