如何判断环的存在?

flcab 2000-12-30 03:17:00
//file edge.java
public class edge
{
String father_code;
String child_code;
public edge(String s1,String s2)
{
father_code=s1;
child_code=s2;
}
public static void main(String[] args){
edge graph[]=new edge[10];
graph[0]=new edge("001","002");
graph[1]=new edge("002","003");
graph[2]=new edge("003","004");
graph[3]=new edge("001","004");
graph[4]=new edge("002","004");
graph[5]=new edge("005","006");
graph[6]=new edge("006","007");
graph[7]=new edge("004","005");
graph[8]=new edge("007","002");
graph[9]=new edge("006","008");
}
}

问题是,如何判断edge[]数组中存在环?
例如上例中存在环 "002"->"004"->"005"->"006"->"007"->"002"...
...全文
300 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
flcab 2001-01-03
  • 打赏
  • 举报
回复
我也做出来了,谢谢
看了一些图论的书.
原理是,如果有向图D的某个节点只有出边,或者只有入边
可以把和这个节点相连的边去掉
如此重复,如果能去掉所有的边,则无环

/*生成关联矩阵
a(nxp) n-节点数,p-边数
对每条边j
a(i,j)=1 j从i节点开始
a(i,j)=-1j到i节点结束
a(i,j)=0 其他
*/
boolean change = true;
int sum, count;
java.util.Hashtable ht = new java.util.Hashtable();
while (change) {
change = false;
for (i = 0; i < n; i++) {
if (ht.containsKey(new Integer(i)))
continue;
sum = 0;
count = 0;
for (j = 0; j < p; j++)
if (a[i][j] != 0) {
sum += a[i][j];
count++;
}
if (sum == count || sum == -count) { //w过程 change = true;
ht.put(new Integer(i), new Integer(i));
for (j = 0; j < p; j++)
if (a[i][j] != 0)
for (int k = 0; k < n; k++)
a[k][j] = 0;
}
}
}
for (i = 0; i < n; i++)
for (j = 0; j < p; j++)
if (a[i][j] != 0)
return false; //有环,可以把a矩阵打出来,看到具体环
return true;//无环
ed9er 2001-01-03
  • 打赏
  • 举报
回复
靠,烂排版,有信箱的话我发给你

ed9er 2001-01-03
  • 打赏
  • 举报
回复
我这个写的不好,也是在学习阶段的,写完后发现在栈中还应该存放遍历过的边,你自己改吧:

//file Graph.java
class Edge {

public String start;
public String end;

public Edge( String s1, String s2) {
start = s1;
end = s2;
}

}

// like a Stack
class Chain {

int pointer;
String node[];

public Chain( int capacity ) {
node = new String[capacity];
pointer = 0;
}

public boolean addNode( String s ) {
for( int i = 0; i < pointer; i++ )
if( s.equals(node[i]) ) {
System.out.print("Chain: ");
for( int j = i; j < pointer; j++ )
System.out.print( " [" + node[j] +"] " );
System.out.println(" [" + s + "] " );
return false;
}
node[pointer++] = s;
return true;
// catch ArrayIndexOutOfBoundsException
}

public void removeNode() {
if( pointer > 0 ) pointer--;
return;
}

public String recent() {
if( pointer <= 1 ) return null;
return node[pointer-2];
}

public void prt() {
System.out.print("Chain: ");
for( int i = 0; i < pointer; i++ )
System.out.print( " [" + node[i] +"] " );
}

}

public class Graph {

Edge edges[];
int edgesNum;

Chain chain;

int nodesNum;
String nodes[];

boolean done[];

public Graph() { // 8 and 10 should be replaced with final const
edges = new Edge[10];
edgesNum = 10;

edges[0]=new Edge("001","002");
edges[1]=new Edge("002","003");
edges[2]=new Edge("003","004");
edges[3]=new Edge("001","004");
edges[4]=new Edge("002","004");
edges[5]=new Edge("005","006");
edges[6]=new Edge("006","007");
edges[7]=new Edge("004","005");
edges[8]=new Edge("007","002");
edges[9]=new Edge("006","008");

nodes = new String[8];
nodesNum = 8;

nodes[0] = "001";
nodes[1] = "002";
nodes[2] = "003";
nodes[3] = "004";
nodes[4] = "005";
nodes[5] = "006";
nodes[6] = "007";
nodes[7] = "008";

done = new boolean[8];
for( int i = 0; i < 8; i++ )
done[i] = false;

chain = new Chain( edgesNum + 1 ); // max
}

public int getNodesNum() {
return nodesNum;
}

public boolean nodeDone( int i ) {
return done[i];
}

public String getNode( int i ) {
return nodes[i];
}

public void determinCircle( String start ) {
if( !chain.addNode(start) ) {
return;
}

for( int i = 0; i < nodesNum; i++ )
if( start.equals( nodes[i] ) ) {
done[i] = true;
break;
}

for( int i = 0; i < edgesNum; i++ ) {
if( edges[i].start.equals(start) && !edges[i].end.equals(chain.recent()) )
determinCircle( edges[i].end );
if( edges[i].end.equals(start) && !edges[i].start.equals(chain.recent()) )
determinCircle( edges[i].start );
}
chain.removeNode();
}

public static void main( String[] args ) {
Graph o = new Graph();
for( int i = 0; i < o.getNodesNum(); i++ )
if( !o.nodeDone(i) )
o.determinCircle( o.getNode(i) );
}

}

输出:

Chain: [001] [002] [003] [004] [001]
Chain: [002] [003] [004] [002] <--
Chain: [002] [003] [004] [005] [006] [007] [002]
Chain: [002] [004] [003] [002] <--重复了
Chain: [001] [002] [004] [001]
Chain: [002] [004] [005] [006] [007] [002]
Chain: [002] [007] [006] [005] [004] [003] [002]
Chain: [001] [002] [007] [006] [005] [004] [001]
Chain: [002] [007] [006] [005] [004] [002]
Chain: [001] [004] [003] [002] [001]
Chain: [004] [003] [002] [004]
Chain: [004] [003] [002] [007] [006] [005] [004]
Chain: [001] [004] [002] [001]
Chain: [004] [002] [003] [004]
Chain: [004] [002] [007] [006] [005] [004]
Chain: [001] [004] [005] [006] [007] [002] [001]
Chain: [004] [005] [006] [007] [002] [003] [004]
Chain: [004] [005] [006] [007] [002] [004]
flcab 2001-01-03
  • 打赏
  • 举报
回复
//w过程 change = true;
中间应该有一个回车
//w过程
change=true;

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧