赞
踩
带权 有向图 邻接矩阵表示 转换为 邻接表
1.图的节点数、图的边数 m n
2. n*n 矩阵(数字间以空格空开,非零表示权)
m个结点 则输出m行
对应结点连接情况
6 10
0 5 0 7 0 0
0 0 4 0 0 0
8 0 0 0 0 0
0 0 5 0 0 6
0 0 5 0 0 0
3 0 0 0 1 0
0:1 3
1:2
2:0
3:2 5
4:2
5:0 4
`# include<stdio.h> # include <malloc.h> #include <iostream> using namespace std; typedef int InfoType; #define MAXV 100 //最大顶点个数 #define INF 32767 //INF 正无穷 //定义邻接矩阵类型 //顶点 typedef struct{ int no;//定点编号 InfoType info;//顶点其他信息 }VertexType;//顶点类型 //图 typedef struct{ int edges[MAXV][MAXV];//邻接矩阵 int vertexNum,arcNum;//顶点数 边数 VertexType vexs[MAXV];//存放顶点信息 }MGraph;//图的邻接矩阵类型 //邻接表类型 //表节点类型 typedef struct ANode{ int adjvex; //这条弧的终点 <i,j> struct ANode *nextarc; //指向下一条边的指针 InfoType infoType;//相关信息,用于存放权值 }ArcNode; //头节点类型 typedef struct VNode{ typedef int Vertex; Vertex data;//顶点信息 ArcNode *firstarc;//指向第一条边 //有趣啊,顺序&结构体 }VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct{ AdjList adjList; int vertexNum,e;//顶点数和边数 }ALGraph; //============================================== //邻接矩阵转换成邻接表 void MatToList(MGraph &M, ALGraph *&A){ int i,j; ArcNode *p; //给邻接表分配内存 A = (ALGraph*)malloc(sizeof(ALGraph)); //遍历头节点 赋初值 for(i=0;i<M.vertexNum;i++) A->adjList[i].firstarc=NULL; //遍历邻接矩阵中的所有元素 for(i=0;i<M.vertexNum;i++) for(j=0;j<i;j++) if(M.edges[i][j]!=0) {//存在<i,j>边 p=(ArcNode*)malloc(sizeof(ArcNode)); //创建一个新的表结点 p->adjvex=j; //弧的终点为j p->nextarc=A->adjList[i].firstarc; //邻接表: 头节点 表结点; // 新的表结点的链域nextarc存放 之前表结点的地址(在头节点的链域里) A->adjList[i].firstarc=p;//将p接在头节点后面 } } //输出邻接矩阵M void DispMat(MGraph M) { int i,j; for(i=0;i<M.vertexNum;i++) for(j=0;j<M.vertexNum;j++) printf("%3d",M.edges[i][j]); printf("\n"); } //输出邻接表 void DispAdj(ALGraph *A) { int i; ArcNode *p; for(i=0;i<A->vertexNum;i++) { p=A->adjList[i].firstarc; cout<<i<<":"; while (p!=NULL) { cout<<p->adjvex<<""; p=p->nextarc; } printf("\n"); } } // main int main(){ int i,j; MGraph M; ALGraph *A; int m,n; cin>>n>>m;//n节点数 m边数 int k[n][n]; for(int i=0;i<M.vertexNum;i++){ for(int j=0;j<M.vertexNum;j++){ cin>>k[i][j]; } } M.vertexNum=n; M.arcNum=m; for(i=0;i<M.vertexNum;i++) for(j=0;j<M.vertexNum;j++) M.edges[i][j]=k[i][j]; A=(ALGraph*)malloc(sizeof(ALGraph)); MatToList(M,A) ; DispAdj(A); } // 输入ok 无显示`
//邻接矩阵转换成邻接表 void MatToList(MGraph &M, ALGraph *&A){ int i,j; ArcNode *p; //给邻接表分配内存 A = (ALGraph*)malloc(sizeof(ALGraph)); //遍历头节点 赋初值 for(i=0;i<M.vertexNum;i++) A->adjList[i].firstarc=NULL; //遍历邻接矩阵中的所有元素 for(i=0;i<M.vertexNum;i++) for(j=0;j<i;j++) if(M.edges[i][j]!=0) {//存在<i,j>边 p=(ArcNode*)malloc(sizeof(ArcNode)); //创建一个新的表结点 p->adjvex=j; //弧的终点为j p->nextarc=A->adjList[i].firstarc; //邻接表: 头节点 表结点; // 新的表结点的链域nextarc存放 之前表结点的地址(在头节点的链域里) A->adjList[i].firstarc=p;//将p接在头节点后面 } }
void ListToMat(ALGraph *A,MGraph &M)
{ int i;
ArcNode *p;
for (i=0;i<A->vertexNum;i++)
{ p=A->adjlist[i].firstarc;
while (p!=NULL)
{ M.edges[i][p->adjvex]=1;
p=p->nextarc;
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。