kahn算法:
1. 在有向图中选一个入度为零的点,并输出
2. 从图中删除所有与该点相关的边
3. 重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。
void kahn()
{
stack<int> s;
int r[6]; //记录每个点的入度
for(int i=0;i<6;i++){
r[i]=0;
}
//统计每个点的入度
int num=0;
for(int i=0;i<6;i++){
num=0;
for(int j=0;j<6;j++){
if(a[j][i] == 1) num++;
}
r[i]=num;
}
//把入度为零的入栈
for(int i=0;i<6;i++){
if(r[i]==0) s.push(i);
}
//count用于计算输出点的个数
int count=0;
while(!s.empty()){
int x=s.top();
s.pop();
cout<<x<<endl;
for(int i=0;i<6;i++){
if(a[x][i] == 1){
r[i]--;
if(r[i]==0) s.push(i);
}
}
count++;
}
if(count == 6) cout<<"此图无环"<<endl;
else cout<<"此图有环"<<endl;
}
深度优先搜索:
void DFS(int u)
{
visit[u] = true;
for(int i=0;i<6;i++){
if(a[u][i]==1 && visit[i]==false){
DFS(i);
}
}
// 每次在递归结束时入栈
// 即当前顶点没有指向其他顶点的边了,也就是一条路径的最后一个顶点
s.push(u);
}