Topologiques concept Trier : dans un, pour tous les noeuds sont classés dans la figure, un noeud pointant vers elle ne nécessite aucun nœud précédent.
Procédé : les premières statistiques pour tous les noeuds, pour le degré du noeud 0 peut être isolé, puis le degré de -1 à des points de noeud de ce noeud. Ce processus est répété jusqu'à ce que tous les noeuds ont été isolés. PS: S'il n'y a pas le dernier noeud de degré zéro, il montre qu'il ya un anneau, tri topologique n'existe pas, qui est beaucoup de problèmes sans solution de la situation.
Après qu'ils apprennent à connaître le tri topologique, le sujet est un titre de modèle, comme suit:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int maxn=105;
queue<int> q;
vector<int> vi[maxn];
int in[maxn];//in[n]代表第n个节点的入度
int main(){
int n;
cin >> n;
for(int i=1;i<=n;i++){
int m;
cin >> m;
for(int j=0;j<m;j++){
int x;
cin >> x;
vi[i].push_back(x);
in[x]++;
}
}
for(int i=1;i<=n;i++) cout << in[i] << " ";
cout << endl;
for(int i=1;i<=n;i++){//n,节点总数
if(in[i]==0) q.push(i);//将入度为0的点入队
}
int cnt=0;//操作次数
while(!q.empty())//遍历队列
{
int p=q.front();//取出一个入度为0的点
q.pop();
for(int i=0;i<vi[p].size();i++)//将入度为0的点所指向的点的入度减一
{
int y=vi[p][i];
in[y]--;
if(in[y]==0){//如果剩下的点中出现入度为0的点,将其入队
q.push(y);
}
}
cnt++;
}
//如果cnt==n,代表所有的节点都可以被分离出来,即不存在环
if(cnt==n) cout << 1 << endl;
else cout << 0 << endl;
return 0;
}