Rationalité tâche pat ordonnancement - tri topologique

  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;
}
Publié 10 articles originaux · louange 7 won · vues 159

Je suppose que tu aimes

Origine blog.csdn.net/qq_44204959/article/details/104683361
conseillé
Classement