#include<iostream>
#include<stack>
#include<queue>
using namespace std;
template<class T>
class Edge{
public:
int start,end;
T weight;
Edge(){
}
Edge(int s,int e,T w):start(s),end(e),weight(w){}
bool operator >(Edge<T> oth){
return weight>oth.weight;
}
bool operator <(Edge<T> oth){
return weight<oth.weight;
}
};
class Graph{
protected:
int **matrix;
public:
int nodeNum;
int edgeNum;
int *Mark;
Graph(int verticesNum){
edgeNum = 0;
nodeNum = verticesNum;
Mark = new int[nodeNum];
for(int i = 0;i<nodeNum;i++)Mark[i] = 0;
matrix =(int **)new int*[nodeNum];
for(int i =0;i<nodeNum;i++)matrix[i] = new int[nodeNum];
for(int i = 0;i<nodeNum;i++)
for(int j = 0;j<nodeNum;j++)
matrix[i][j] = 0;
}
~Graph(){
delete []Mark;
for(int i = 0;i<nodeNum;i++)delete []matrix[i];
delete []matrix;
}
void setEdge(int f,int s,int w){
if(!matrix[f][s]){
edgeNum++;
}
matrix[f][s] = matrix[s][f] = w;
}
void delEdge(int f,int s){
if(!matrix[f][s]){
edgeNum--;
}
matrix[f][s] = matrix[s][f] = 0;
}
void deepFirst(){
for(int i = 0;i<nodeNum;i++)Mark[i] = 0;
for(int i = 0;i<nodeNum;i++)
if(Mark[i] == 0)DFS(i);
}
void DFS(int n){
Mark[n] = 1;
cout<<n<<" ";
for(int i = 0;i<nodeNum;i++){
if(matrix[n][i]){
if(Mark[i] == 0)DFS(i);
}
}
}
void deepFirstWithoutRecusion(){
stack<int> s;
for(int i = 0;i<nodeNum;i++)Mark[i] = 0;
for(int i = 0;i<nodeNum;i++){
if(Mark[i] == 0){
s.push(i);
cout<<i<<" ";
Mark[i] = 1;
while(!s.empty()){
int v = s.top();
s.pop();
for(int j = 0;j<nodeNum;j++){
if(matrix[v][j] != 0){
if(Mark[j] == 0){
s.push(j);
cout<<j<<" ";
Mark[j] = 1;
}
}
}
}
}
}
}
void levelFirst(){
for(int i = 0;i<nodeNum;i++)Mark[i] = 0;
for(int i = 0;i<nodeNum;i++)
if(Mark[i] == 0)BFS(i);
}
void BFS(int v){
queue<int> q;
Mark[v] = 1;
q.push(v);
cout<<v<<" ";
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=0;i<nodeNum;i++){
if(matrix[u][i] && Mark[i] == 0){
q.push(i);
cout<<i<<" ";
Mark[i] = 1;
}
}
}
}
Edge<int> * Prim(int s){
//从s 顶点出发得到的最小生成树
int Affinity = -1000;
Edge<int> * MST = NULL;
int * nearest; //生成树中到节点i 的最小边的权值
int * neighbor;//生成树中与i 最近的编号
//-1表示已经在树中
nearest = new int[nodeNum];
neighbor =new int[nodeNum];
MST = new Edge<int>[nodeNum-1];
for(int i = 0;i<nodeNum;i++){
neighbor[i] = s;//左右顶点相邻的
nearest[i] = Affinity;
}
for(int i = 0;i<nodeNum;i++){
if(matrix[s][i]){
nearest[i] = matrix[s][i];
}
}
neighbor[s] = -1;//s点已经在树中
for(int i = 1;i<nodeNum;i++){
int min = Affinity;
int v = -1;
for(int j = 0;j<nodeNum;j++){
if(nearest[j]<min&&neighbor[j]>-1){
min = nearest[j];
v = j;
}
}
if(v>=0){
neighbor[v] = -1;
Edge<int> tmp(s,v,nearest[v]);
MST[i] = tmp;
for(int m = 0;m<nodeNum;m++){
if(matrix[v][m]){//v-? 边筛选
if(neighbor[m]>=0&&nearest[m]>matrix[v][m]){
neighbor[m] = v;
nearest[m] = matrix[v][m];
}
}
}
}
}
delete []neighbor;
delete []nearest;
return MST;
}
};
无向图的广度、深度搜索以及Prim算法生成等价类
最新推荐文章于 2022-12-15 22:50:14 发布