拓补排序

//输入形式是邻接矩阵
#include <iostream>
#include <stack>
using namespace std;
class ArcNode {
public:
    int adjvex;
    ArcNode *next;
    ArcNode() :next(NULL) {}
};
class VNode {
public:
    char data;
    ArcNode *first;
    VNode():first(new ArcNode()){}
};
class Map {
    VNode *vertices;
    int vexnum;
    int arcnum;
    bool *final;
    int *indegree;
    bool TopologicalSort(int count);
public:
    Map(int vnum,int **mx);
    bool TopologicalSort();
};
Map::Map(int vnum, int **mx) {
    vexnum = vnum;
    vertices = new VNode[vexnum];
    for (int i = 0; i < vexnum; i++) {
        ArcNode *p = vertices[i].first;
        for (int j = 0; j < vexnum; j++) 
            if (mx[i][j]) {
                p->adjvex = j;
                p->next = new ArcNode();
                p = p->next;
            }
    }

    final = new bool[vexnum];
    for (int i = 0; i < vexnum; i++)
        final[i] = false;
}
bool Map::TopologicalSort(int count) {
    indegree = new int[vexnum];
    for (int i = 0; i < vexnum; i++)
        indegree[i] = 0;
    for (int i = 0; i < vexnum; i++) {
        for (int j = 0; j < vexnum; j++) {
            ArcNode *p = vertices[j].first;
            while (p->next) {
                if (p->adjvex > i) break;
                if (p->adjvex == i) indegree[i]++;
                p = p->next;
            }
        }
    }
    stack<int> s;
    for (int i = 0; i < vexnum; i++)
        if (!indegree[i] && !final[i]) {
            final[i] = true;
            s.push(i);
            cout << i << ' ';
        }
    while (!s.empty()) {
        int v = s.top();
        s.pop();
        count++; 
        ArcNode *p = vertices[v].first;
        while (p->next) {
            indegree[p->adjvex]--;
            p = p->next;
        }
        for (int i = 0; i < vexnum; i++)
            if (!indegree[i] && !final[i]) {
                s.push(i);
                final[i] = true;
                cout << i << ' ';
            }
    }
    if (count < vexnum) return false;
    return true;
}
bool Map::TopologicalSort() {
    int count =0;
    cout << count << endl;
    if (TopologicalSort(count)) {
        cout << endl;
        return true;
    }
    cout << endl;
    return false;
}
int main() {
    int t;
    cin >> t;
    while (t--) {
        int vnum;
        cin >> vnum;
        int **mx = new int*[vnum];
        for (int i = 0; i < vnum; i++)
            mx[i] = new int[vnum];
        for (int i = 0; i < vnum; i++)
            for (int j = 0; j < vnum; j++)
                cin >> mx[i][j];
        Map map(vnum, mx);
        if (map.TopologicalSort())
            cout << "无圈图" << endl;
        else
            cout << "有圈图" << endl;
        for (int i = 0; i < vnum; i++)
            delete mx[i];
        delete mx;
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值