图拓扑排序

做个记录

//
//  main.cpp
//  graph
//
//  Created by yiqiao on 16/4/21.
//  Copyright  2016年 yiqiao. All rights reserved.
//


#include <iostream>
#include <stack>


class node;
typedef node* nodeptr;
class node{
public:
    int V;
    nodeptr next;
};
class graphNode
{
public:
    int degree;//入度
    nodeptr head;//头节点
};
#define MAXV 10
graphNode graph[MAXV];//graph[0]未用
int n = 7;
void newEdge(int i,int j)
{
    node * pNode = new node;
    pNode->V = j;
    pNode->next = NULL;
    nodeptr last = graph[i].head;
    while (last){
        if (last->next == NULL)
            break;
        last = last->next;
    }
    last->next = pNode;
    graph[j].degree++;
}
void initGraph()
{
    for (int i = 1; i <= n; i++){
        graph[i].degree = 0;
        graph[i].head = new node;
        graph[i].head->V = i;
        graph[i].head->next = NULL;
    }
    
    newEdge(1, 2);
    newEdge(1, 4);
    newEdge(1, 3);
    
    newEdge(2, 5);
    newEdge(2, 4);
    
    newEdge(3, 6);
    
    newEdge(4, 3);
    newEdge(4, 6);
    newEdge(4, 7);
    
    newEdge(5, 4);
    newEdge(5, 7);
    
    newEdge(7, 6);
    
}
void topsort()
{
    std::stack<graphNode*> s;
    for (int i = 1; i <= n; i++){
        if (graph[i].degree == 0)
            s.push(&graph[i]);
    }
    
    while(!s.empty()){
        graphNode* node = s.top();
        
        s.pop();
        std::cout << node->head->V << "  ";
        
        nodeptr link = node->head->next;
        while (link){
            if (--graph[link->V].degree <= 0){
                s.push(&graph[link->V]);
            }
            link = link->next;
        }
    }
    
    std::cout << std::endl;
}
void printGraph()
{
    for (int i = 1; i <= n; i++){
        std::cout << graph[i].degree << "   edge:";
        nodeptr node = graph[i].head;
        while (node) {
            nodeptr next = node->next;
            if (next)
                std::cout <<node->V<< "->";
            else
                std::cout <<node->V;
            node = next;
        }
        std::cout << std::endl;
    }
}
void freeGraph()
{
    for (int i = 1; i <= n; i++){
        nodeptr node = graph[i].head->next;
        while (node) {
            nodeptr next = node->next;
            delete node;
            node = next;
        }
        delete graph[i].head;
    }
}


int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    
    initGraph();


    printGraph();
    topsort();
    
    freeGraph();
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值