拓扑排序的实现方法:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
Harry and Magical Computer
Accepts: 408
Submissions: 1622
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
分析:判断是否可以拓扑排序,有向图中是否有环,最简单的拓扑排序算法。
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<stack>
using namespace std;
int arc[501][501] ;
int top ;
int used[501] ; // 标记访问过
int index[501] ; // 统计入度数组
int m , n ;
stack<int>st ;
bool istopsort(){
int countt = 0 ;
for(int i =1 ; i<= n ; i++){
if(!index[i])
st.push(i);
}
while(!st.empty()){
int tt = st.top() ;
index[tt] -- ;
st.pop() ;
countt ++ ;
for(int i = 1 ; i<=n ;i++)
if(arc[tt][i]){
index[i]-- ;
if(!index[i])
st.push(i) ;
}
}
if(countt == n)
return 1 ;
else return 0 ;
}
int main()
{
int a,b;
while(scanf("%d%d", &n , &m) != EOF){
memset(arc, 0, sizeof(arc)) ;
memset(index , 0 , sizeof(index)) ;
for(int i =1 ; i<=m ; i++){
scanf("%d%d" , &a , &b) ;
if(!arc[a][b]){
arc[a][b] = 1 ;
index[b] ++ ;}
}
if(istopsort())
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}