一、题目
二、非STL
#include<iostream>
using namespace std;
class Graph
{
private:
int n;
int** matrix;
int* visit;
void find();
public:
Graph(int n);
void display();
};
Graph::Graph(int N)
{
n = N;
visit = new int[n];
for (int i = 0; i < n; i++)
{
visit[i] = -1;
}
matrix = new int* [n];
for (int i = 0; i < n; i++)
{
matrix[i] = new int[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> matrix[i][j];
}
}
}
void Graph::find()
{
for (int i = 0; i < n; i++)
{
if (visit[i] != 1)
{
int flag = 0;
for (int j = 0; j < n; j++)
{
if (matrix[j][i] == 1)
{
flag = 1;
}
}
if (flag == 0)
{
cout << i << " ";
visit[i] = 1;
for (int j = 0; j < n; j++)
{
matrix[i][j] = 0;
}
find();
}
}
}
}
void Graph::display()
{
find();
for (int i = 0; i < n; i++)
{
if (visit[i] == -1)
{
cout << i << " ";
}
}
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
Graph a(n);
a.display();
}
return 0;
}
三、STL
#include <iostream>
#include <vector>
using namespace std;
class Graph {
public:
vector<bool> isFinished; //索引号所指示的顶点是否已处理过
vector<vector<int> > adjMat; //邻接矩阵
int n; //顶点数 as 成员变量
public:
void readAdjMatrix() {
//从输入读入邻接矩阵,存入this->adjMat
cin >> this->n; //顶点数
int i = 0;
for (; i < n; ++i) {
//TODO:设置this->isFinished数组:每个顶点未曾访问过
//提示:调用vector::push_back方法
isFinished.push_back(0);
vector<int> row;
int j = 0;
for (; j < n; ++j) {
int edge;
cin >> edge; //读入顶点对i,j之间是否有一条边
row.push_back(edge);//TODO:将边信息增加入row
}
//TODO:将row增加入this->adjMat
//提示:以row为参数,调用adjMat的push_back方法
adjMat.push_back(row);
}
}
bool isZeroInDegrees(int vertexNo) {
//判定顶点vertexNo是否没有入度
int i = 0;
//this->adjMat[i][vertexNo] == 0
//表示顶点i与vertexNo之间没有边相连
int flag = 0;
for (i = 0; i < n; i++)
{
if (adjMat[i][vertexNo] == 1)
{
flag = 1;
}
}
if (flag == 0)
{
return 1;
}
else
{
return 0;
}
//TODO:返回true if 顶点vertexNo没有入度; false [otherwise]
}
int select() {
//从所有顶点中,选出一个顶点i,满足:
//1) i没有处理过,即isFinished[i]=false
//2) i的入度为0
int i = 0;
for (; i < n; ++i) {
//TODO:若顶点i的已经处理过,则pass
//TODO:若顶点度>0,则pass
//提示:调用isZeroInDegrees
//TODO: 设置顶点i已经处理过,即isFinished[i]为正确值
//TODO: 返回i
if (isFinished[i] != 1 && isZeroInDegrees(i) != 0)
{
isFinished[i] = 1;
return i;
}
}
//TODO: 返回-1, 表示未找到满足1)+2)条件的顶点
return -1;
}
void update(int rootNo) {
//更新顶点rootNo的出弧,即将顶点rootNo从图中断开
//cout << "wuhu" << rootNo << " ";
int j = 0;
for (; j < n; ++j) {
//TODO: 设置adjMat[rootNo][j]为0
adjMat[rootNo][j] = 0;
}
}
/
// 拓扑排序主算法
void topologySort() {
int i = 0;
for (; i < n; ++i) { //遍历n次:即按拓扑序,依次选择(排出)n个顶点
int root; // 声明顶点索引号(编号)用于存放本次选出的顶点
//TODO: 调用select方法,并将其返回值存入root
root = select();
//TODO: 若root=-1,则break;
if (root == -1)
{
break;
}
else
{
cout << root << " ";
update(root);
/*cout << "quanbu" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << adjMat[i][j] << " ";
}
cout << endl;
}*/
}
}
cout << endl;
//TODO:输出一行
}
void main() {
readAdjMatrix();
topologySort();
}
};
int main() {
int t;
cin >> t;
while (t--) {
Graph g;
g.main();
}
return 0;
}