图结构:
节点、边定义:
#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待补充