正在加载图片...
可能有多种存储顺序,比如142857等同于285714和571428所以还要调整行向量 的次序并存入temp数组例如, thiscycle为142857第一个结点为1, cycles的当前 向量为857142,则找到后者中的1,把1后部分提到1前部分前面最终在temp中 得到142857,与 thiscycle比较发现相同,因此142857和857142是同一条回路,不 予存储这个算法太复杂很难保证细节的准确性,大家理解思路便可希望有人给 出更加简捷的算法 731 int visited MAXSIZe] int finished MAXSIZE]; Int count; /count在第一次深度优先遍历中用于指示 finished数组的填充位置 void Get SGraph(OLGraph G/求十字链表结构储存的有向图G的强连通分量 count=0 for(v=0; V<G. vexnum v++)visited[v=0 forv=0v< G. vexnum;v++)∥第一次深度优先遍历建立 finished数组 edvd deSI(G, v); for(v=0y< G. vexnum y++) visited v}=0,/清空 visited数组 for(i= G. vexnum-1;>=0;-)∥第二次逆向的深度优先遍历 (1), printf("n"),∥不同的强连通分量在不同的行输出 DFS2(G, V) i/fe void dfS 1( OLGraph G, int v第一次深度优先遍历的算法 edv= for(p=G xlist[v]. firstout p p=p->tlink) >head if(visited w))DFSI(G, w); 团∥fo finished[++ count=v;在第一次遍历中建立 finished数组 1//DFS void dFs2( OGRaph G, int v)第二次逆向的深度优先遍历的算法 edv=可能有多种存储顺序,比如 142857 等同于 285714 和 571428,所以还要调整行向量 的次序,并存入 temp 数组,例如,thiscycle 为 142857 第一个结点为 1,cycles 的当前 向量为 857142,则找到后者中的 1,把 1 后部分提到 1 前部分前面,最终在 temp 中 得到 142857,与 thiscycle 比较,发现相同,因此 142857 和 857142 是同一条回路,不 予存储.这个算法太复杂,很难保证细节的准确性,大家理解思路便可.希望有人给 出更加简捷的算法. 7.31 int visited[MAXSIZE]; int finished[MAXSIZE]; int count; //count 在第一次深度优先遍历中用于指示 finished 数组的填充位置 void Get_SGraph(OLGraph G)//求十字链表结构储存的有向图 G 的强连通分量 { count=0; for(v=0;v<G.vexnum;v++) visited[v]=0; for(v=0;v<G.vexnum;v++) //第一次深度优先遍历建立 finished 数组 if(!visited[v]) DFS1(G,v); for(v=0;v<G.vexnum;v++) visited[v]=0; //清空 visited 数组 for(i=G.vexnum-1;i>=0;i--) //第二次逆向的深度优先遍历 { v=finished(i); if(!visited[v]) { printf("\n"); //不同的强连通分量在不同的行输出 DFS2(G,v); } }//for }//Get_SGraph void DFS1(OLGraph G,int v)//第一次深度优先遍历的算法 { visited[v]=1; for(p=G.xlist[v].firstout;p;p=p->tlink) { w=p->headvex; if(!visited[w]) DFS1(G,w); }//for finished[++count]=v; //在第一次遍历中建立 finished 数组 }//DFS1 void DFS2(OLGraph G,int v)//第二次逆向的深度优先遍历的算法 { visited[v]=1;
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有