(1)图的表示

整理了一下学习数据结构和算法的笔记,做了一个总结。

大部分代码都可以运行并查看效果,希望能有哪怕一个人能够有所收获。

代码完全没有考虑优化,望体谅。如有错误欢迎指出。

 

图一般用数组或者邻接表表示。

这段代码使用数组表示,没有输入输出,无法运行。


#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值