C++实现数据结构——图(Graph)

图结构:

 

节点、边定义:

#include <iostream>
#include <vector>
#include <queue>
#include "stack"

using namespace std;

typedef enum{discovered,undisvovered,visited}status;
typedef enum{undetermined,tree,cross,backward}type;

class Node{
public:
    char value;
    int inNum;
    int outNum;
    status s;
    Node(char c){
        value = c;
        inNum = 0;
        outNum = 0;
        s = undisvovered;
    }
};

class Edge{
public:
    int weight;
    type t;
    Edge(int w){
        weight = w;
        t = undetermined;
    }
};

图定义:

class Graph{
private:
    void bfs(int n);
    void dfs(int n);
    void topoFrom(int n,stack<Node>&result,int& flag);
public:
    vector<Node> nodeList;
    vector<vector<Edge*>> graphMartrix;
    int nodeNum;
    int edgeNum;
    Graph(){
        nodeNum = 0;
        edgeNum = 0;

    }
    void insertNode(char v);
    void insertEdge(int from,int to,int w);
    void BFS(int n);
    void DFS(int n);
    void topoSort();
};

实现:插入点、插入边,DFS、BFS、拓扑排序

void Graph::insertNode(char v) {
    for(int i = 0; i<nodeNum;i++){
        graphMartrix[i].push_back(NULL);
    }

    Node newNode(v);
    nodeList.push_back(newNode);
    nodeNum++;
    graphMartrix.push_back(vector<Edge*>(nodeNum,NULL));
}

void Graph::insertEdge(int from, int to, int w) {
    Edge* newEdge = new Edge(w);
    graphMartrix[from][to] = newEdge;
    edgeNum++;
    nodeList[from].outNum++;
    nodeList[to].inNum++;
}


void Graph::bfs(int n) {
    queue<Node>q;
    int currentNum = n;
    q.push(nodeList[n]);
    while(!q.empty()){
        Node cur = q.front();
        q.pop();
        cout<<cur.value<<" ";
        cur.s = visited;
        for(int i = 0;i<nodeNum;i++){
            if(graphMartrix[currentNum][i] && nodeList[i].s == undisvovered ){
                nodeList[i].s = discovered;
                graphMartrix[currentNum][i]->t = tree;
                q.push(nodeList[i]);
            }else if(graphMartrix[currentNum][i] && (nodeList[i].s == discovered ||nodeList[i].s == visited)){
                graphMartrix[currentNum][i]->t=cross;
            }
        }

        for(int i = 0 ; i<nodeNum;i++){
            if(q.front().value == nodeList[i].value){
                currentNum = i;
                break;
            }
        }
    }
}
void Graph::BFS(int n) {
    nodeList[n].s = discovered;
    bfs(n);
    for(int i = 0;i<nodeNum;i++){
        if(nodeList[i].s == undisvovered){
            bfs(i);
        }
    }
}
void Graph::dfs(int n) {
    cout<<nodeList[n].value<<" ";
    for(int i = 0;i<nodeNum;i++){
        if(graphMartrix[n][i] && nodeList[i].s == undisvovered){
            nodeList[i].s = discovered;
            graphMartrix[n][i]->t = tree;
            dfs(i);
        }else if(graphMartrix[n][i] && nodeList[i].s == discovered){
            graphMartrix[n][i]->t = backward;
        }
    }
    nodeList[n].s = visited;
}
void Graph::DFS(int n) {
    nodeList[n].s = discovered;
    dfs(n);
    for(int i = 0;i<nodeNum;i++){
        if(nodeList[i].s == undisvovered){
            dfs(i);
        }
    }
}

void Graph::topoSort() {
    int start;
    for(int i = 0; i<nodeNum;i++){
        if(nodeList[i].s==undisvovered && nodeList[i].inNum==0){
            start = i;
        }
    }
    if(start == nodeNum){
        cout<<"no topo!"<<endl;
        return;
    }
    stack<Node>result;

    cout<<"start from"<<nodeList[start].value<<endl;

    int flag = 1;
    topoFrom(start,result,flag);
    if(flag ==1){
       while(!result.empty()){
           cout<<result.top().value<<" ";
           result.pop();
       }
    }
}
void Graph::topoFrom(int n, stack<Node> &result,int& flag) {
    nodeList[n].s = discovered;
    for(int i = 0;i<nodeNum;i++){
        if(graphMartrix[n][i] && nodeList[i].s == undisvovered){
            nodeList[i].s = discovered;
            topoFrom(i,result,flag);
        }else if(graphMartrix[n][i] && nodeList[i].s == discovered){
            flag=0;
            cout<<"No topo!"<<endl;
            return;
        }
    }
    nodeList[n].s = visited;
    result.push(nodeList[n]);
}

测试:

int main(){
    Graph g;
    g.insertNode('A');
    g.insertNode('B');
    g.insertNode('C');
    g.insertNode('D');
    g.insertNode('E');
    g.insertNode('F');
    g.insertEdge(0,1,100);
    g.insertEdge(0,4,30);
    g.insertEdge(0,2,60);
    g.insertEdge(1,3,40);
    g.insertEdge(2,5,70);
    g.insertEdge(2,3,90);
    g.insertEdge(3,4,45);
    g.insertEdge(5,2,80);
    g.insertEdge(5,3,33);

//  g.BFS(5);
//  g.DFS(0);
//  g.topoSort();
}

Prim Krustal Dijkstra待补充

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值