拓扑排序
拓扑概念:前后顶点是一对有序的顶点。
样例构造:
V1和V6无入度顶点,说明他们可以无条件进入。
想要进入V2,必须完成先决条件,进入V1.
同理,V3的先决条件是V1.
V5的先决条件是V3,V4,V6,三个顶点先完成。
- package 拓扑排序;
-
- import java.util.ArrayList;
-
- public class kaha {
- static int dist[]=new int[7];
- static int s[]=new int[7];
- public static void main(String args[])
- {
- int N=6;
- ArrayList rlist = new ArrayList();
-
- int map[][]={
- {0,0,0,0,0,0,0},
- {0,0,1,1,1,0,0},
- {0,0,0,0,0,0,0},
- {0,0,1,0,0,1,0},
- {0,0,0,0,0,1,0},
- {0,0,0,0,0,0,0},
- {0,0,0,0,1,1,0}
- };
-
- for(int i=1;i<=N;i++){
- for(int j=1;j<=N;j++)
- {
- if(map[j][i]!=0){
- dist[i]++;
- }
- }
- }
-
- int tempsum=N;
- while(tempsum>=1)
- {
- int i;
- for(i=1;i<=N;i++)
- {
- if(s[i]!=1&&dist[i]==0)
- {
- s[i]=1;
- rlist.add(i);
- tempsum--;
- break;
- }
- }
-
-
- for(int j=1;j<=N;j++)
- {
-
-
-
- if(s[j]!=1&&map[i][j]!=0)
- dist[j]--;
- }
-
-
- }
-
- for(Object temp:rlist)System.out.print(" "+temp);
-
- }
- }
---------------------------------------------------------1/3更新----------------------------------------------
上述的代码存在一个缺陷:不能处理非拓扑图,也就是说如果一个图存在环路,则无法处理。
为什么存在拓扑图存在回路是不行的?
试着从实际意义上去理解:如果两个顶点A和B,互相联系的话,进入顶点A的先决条件是进入顶点B,而进入顶点B的条件是进入顶点A。这样就存在矛盾了,到底是应该先做哪一个呢。所以拓扑图是不允许有回路的。
反映到代码中如何检查存在环呢?
如果一个图存在环:按照kaha算法,进行到某一部分的时候,必定会有这种情况发生:
不存在入度为0的顶点,但是n个顶点却都还没全部执行完,这个时候就可以判定图存在环路了。
如果图中存在环,那么图必定存在上述的矛盾,所以可以使用这个方法来判断回路。
- package 拓扑排序;
-
- import java.util.ArrayList;
-
- public class kaha {
- static int dist[]=new int[7];
- static int s[]=new int[7];
- public static void main(String args[])
- {
- int N=6;
- ArrayList rlist = new ArrayList();
-
-
-
-
-
-
-
-
-
-
-
-
- int map[][]={
- {0,0,0,0,0,0,0},
- {0,0,1,1,1,0,0},
- {0,1,0,0,0,0,0},
- {0,0,1,0,0,1,0},
- {0,0,0,0,0,1,0},
- {0,0,0,0,0,0,0},
- {0,0,0,0,1,1,0}
- };
-
- for(int i=1;i<=N;i++){
- for(int j=1;j<=N;j++)
- {
- if(map[j][i]!=0){
- dist[i]++;
- }
- }
- }
-
- int tempsum=N;
- while(tempsum>=1)
- {
- int i;
- for(i=1;i<=N;i++)
- {
- if(s[i]!=1&&dist[i]==0)
- {
- s[i]=1;
- rlist.add(i);
- tempsum--;
- break;
- }
- }
-
-
- if(i<=N)
- {
-
- for(int j=1;j<=N;j++)
- {
-
-
-
- if(s[j]!=1&&map[i][j]!=0){
- dist[j]--;
- }
- }
- }
- else
- {
- System.out.println("此图存在环路,非拓扑图");
- break;
- }
-
- }
-
- if(tempsum==0)
- for(Object temp:rlist)System.out.print(" "+temp);
-
- }
- }