Plantilla de clasificación topológica clásica

  La clasificación topológica es un algoritmo típico en la teoría de grafos. La estructura jerárquica del gráfico se puede clasificar mediante clasificación topológica. Las tareas de teoría de grafos, como la finalización de un período de tiempo, son aplicaciones típicas. La segunda aplicación es determinar si hay un problema de bucle en el gráfico.
  La forma de construir un gráfico en el programa es en forma de lista de adyacencia, el código es el siguiente:

vector<vector<int> > graph(n, vector<int>{
    
    });

  La siguiente es una plantilla para la clasificación topológica:

	vector<vector<int> > graph(n, vector<int>{
    
    });
	
	根据所给有向图的指向关系,完成graph图的建立
	
	// 统计初始入度为0的
	vector<int> indegree(n, 0);
	for (int i=0; i<n; i++) {
    
    
		for (int j=0; j<graph[i].size(); j++) {
    
    
			indegree[graph[i][j]]++;
		}
	} 
	queue<int> que; // 队列存储,其实如果对于顺序没有要求栈也行
	for (int i=0; i<n; i++) {
    
    
		if (indegree[i] == 0)
			que.push(i);
	} 
	while (!que.empty()) {
    
    
		int a = que.front();
		cout << a + 1 << " ";
		que.pop();
		for (int i=0; i<graph[a].size(); i++) {
    
    
			indegree[graph[a][i]]--;
			if (indegree[graph[a][i]] == 0)
				que.push(graph[a][i]);
		}
	}
/*
	如果要判断是否存在环路,可以在最后判断一下indegree数组,如果全为0说明无环,否则说明有环。
*/

  ¡Practiquemos con dos preguntas! (El tema fue encontrado por el blog de otra persona, no desde el sitio web. No fui a OJ para verificar el aire acondicionado, sino que simplemente pasé la prueba de muestra. El formato de salida no está ajustado, ¡apenas lo aprobé!)

Tema 1: Determinar el ranking de la competencia.

el código se muestra a continuación:

#include<bits/stdc++.h>
using namespace std;

int main(void) {
    
    
	int n, m;
	cin >> n >> m;
	vector<vector<int>> graph(n, vector<int>{
    
    });
	for (int i=0; i<m; i++) {
    
    
		int u, v;
		cin >> u >> v;
		graph[u-1].push_back(v-1);
	}
	vector<int> indegree(n, 0);
	for (int i=0; i<graph.size(); i++) {
    
    
		for (int j=0; j<graph[i].size(); j++) {
    
    
			indegree[graph[i][j]]++;
		}
	}
	priority_queue<int> que; // 题目对顺序有要求,这里用了优先队列
	for (int i=0; i<n; i++) {
    
    
		if (indegree[i] == 0)
			que.push(-i);
	}
	while (!que.empty()) {
    
    
		int num = -que.top();
		cout << num + 1 << " ";
		que.pop();
		for (int i=0; i<graph[num].size(); i++) {
    
    
			indegree[graph[num][i]]--;
			if (indegree[graph[num][i]] == 0)
				que.push(-graph[num][i]);
		}
	}
	return 0;
}

Tema 2: POJ 2367: Árbol genealógico

#include<bits/stdc++.h>
using namespace std;

int main(void) {
    
    
	int n;
	cin >> n;
	vector<vector<int> > graph(n, vector<int>{
    
    });
	int i;
	for (int j=0; j<n; j++) {
    
    
		while (1) {
    
    
			cin >> i;
			if (i != 0) 
				graph[j].push_back(i-1);
			else
				break;
		}
	}
	vector<int> indegree(n, 0);
	for (int i=0; i<n; i++) {
    
    
		for (int j=0; j<graph[i].size(); j++) {
    
    
			indegree[graph[i][j]]++;
		}
	} 
	queue<int> que;
	for (int i=0; i<n; i++) {
    
    
		if (indegree[i] == 0)
			que.push(i);
	} 
	while (!que.empty()) {
    
    
		int a = que.front();
		cout << a + 1 << " ";
		que.pop();
		for (int i=0; i<graph[a].size(); i++) {
    
    
			indegree[graph[a][i]]--;
			if (indegree[graph[a][i]] == 0)
				que.push(graph[a][i]);
		}
	}
	return 0;
}

Materiales de referencia: https://blog.csdn.net/wang_123_zy/article/details/81411683

Supongo que te gusta

Origin blog.csdn.net/gls_nuaa/article/details/115102635
Recomendado
Clasificación