整理了一下学习数据结构和算法的笔记,做了一个总结。
大部分代码都可以运行并查看效果,希望能有哪怕一个人能够有所收获。
代码完全没有考虑优化,望体谅。如有错误欢迎指出。
图一般用数组或者邻接表表示。
这段代码使用数组表示,没有输入输出,无法运行。
#include <iostream>
using namespace std;
//图的数组表示
#define infinity INT_MAX
#define MAX_VERTEX_NUM 20
//使用一个顶点数组表示顶点,用一个二维数组的邻接矩阵表示弧
typedef enum {
DG,//有向图
DN,//有向网
UDG,//无向图
UDN //无向网
} GraphKind;
struct VertexType{
int a;
};//顶点类型
typedef struct ArcCell{//矩阵中的一个元素,实际是弧的概念
int adj;//有权图的权值。或无权图用1,0表示是否连接
int *info;//关于弧的信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];//顶点数组
AdjMatrix arcs;//邻接矩阵
int vexnum;//顶点数
int arcnum;//弧数
int kind;//图的中类标志
}MGraph;
int CreateUDN(MGraph &G){
cout<<"弧的个数:";
cin >>G.arcnum ;
cout <<endl;
cout <<"顶点数:";
cin >>G.vexnum ;
cout << endl;
int IncInfo;
cout <<"弧的信息:";
cin >>IncInfo;
cout <<endl;
for(int i=0;i<G.vexnum;++i) cin << G.vexs[i] ;//构造顶点向量
for(i=0;i<G.vexnum;i++){//初始化邻接矩阵
for(int j = 0;j<G.vexnum;j++){
G.arcs[i][j] = {infinity,null};
}
}
for(int k = 0 ; k<G.vexnum;++k){//构造邻接矩阵
cin << int a<<int b << int w ;//输入一条边的位置和权值
G.arcs[a][b].adj=w;
if(IncInfo) cin <<G.arcs[i][j].info;//弧的信息
G.arcs[b][a] = G.arcs[a][b];//设置对称点
}
return 1;
};
int main()
{
MGraph graph;
a = CreateUDN(graph);
if (a=1) cout << true <<endl;
return 0;
}
这段代码使用邻接表表示。
#include <iostream>
using namespace std;
struct VertexType{
char *data;
};
typedef struct ArcCell{
int adj = 100;
}ArcCell,AdjMatrix[6][6];
typedef struct {
VertexType vexs[6];//顶点数组,5个
AdjMatrix arcs;//邻接矩阵
int vexnum = 6;//顶点数
}MGraph;
MGraph init(){
MGraph G;
G.vexs[0].data = "V1";
G.vexs[1].data = "V2";
G.vexs[2].data = "V3";
G.vexs[3].data = "V4";
G.vexs[4].data = "V5";
G.vexs[5].data = "V6";
G.arcs[0][1].adj = 6;
G.arcs[0][2].adj = 1;
G.arcs[0][3].adj = 5;
G.arcs[1][2].adj = 5;
G.arcs[1][4].adj = 3;
G.arcs[2][3].adj = 5;
G.arcs[2][4].adj = 6;
G.arcs[2][5].adj = 4;
G.arcs[3][5].adj = 2;
G.arcs[1][0].adj = 6;
G.arcs[2][0].adj = 1;
G.arcs[3][0].adj = 5;
G.arcs[2][1].adj = 5;
G.arcs[4][1].adj = 3;
G.arcs[3][2].adj = 5;
G.arcs[4][2].adj = 6;
G.arcs[5][2].adj = 4;
G.arcs[5][3].adj = 2;
return G;
}
int main(){
MGraph G = init();
struct{
int a = 0;//基
int mincost = 0;
}closedge[6];
VertexType V = G.vexs[0];
int k = 0;//V的位置
for(int j = 0 ; j < G.vexnum ; j++){
if(j!=0) {
closedge[j].a = k;//到Vk
closedge[j].mincost = G.arcs[k][j].adj;
}
}
for(int i = 1 ; i < G.vexnum ; i++){
int min = 100;
for(int s = 0 ; s < G.vexnum ; s++){
if(closedge[s].mincost != 0 && closedge[s].mincost < min){
min = closedge[s].mincost;
k = s;
}
cout <<"closedge["<<s<<"].a="<<closedge[s].a <<endl;
cout <<"closedge["<<s<<"].mincost="<<closedge[s].mincost <<endl;
}
cout << "min="<<min <<" K="<<k<<endl;
VertexType ver = G.vexs[k];
VertexType ver2 = G.vexs[closedge[k].a];
cout << "添加"<<ver.data <<"到"<<ver2.data <<",权值"<<closedge[k].mincost<<endl;
closedge[k].mincost = 0 ;
for(int j = 0 ; j <G.vexnum;j++){
if(G.arcs[k][j].adj < closedge[j].mincost ) {
closedge[j].a = k;
closedge[j].mincost = G.arcs[k][j].adj;
}
}
}
return 0;
}