7-37 图的存储

输出给定图的邻接矩阵和邻接表。

输入格式:

输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和有向或无向标志S(1表示有向图,0表示无向图)。

随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。

输出格式:

首先输出图的邻接矩阵,即N行N列的元素值,有边其值为1,无边其值为0;以方阵形式输出,每个元素间有一个空格,末尾均有一空格。

然后输出图的邻接表,从第0行开始按顺序输出,共输出N行,具体样式见输出样例。冒号前后无空格,每个元素间有一个空格,末尾均有一空格。

由于图的存储是不唯一的,为了使得输出具有唯一的结果,我们约定以表头插入法构造邻接表。

输入样例:

6 8 0
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5

输出样例:

0 1 0 0 1 0 
1 0 1 0 0 0 
0 1 0 1 0 1 
0 0 1 0 1 1 
1 0 0 1 0 1 
0 0 1 1 1 0 
0:4 1 
1:2 0 
2:5 3 1 
3:5 4 2 
4:0 5 3 
5:2 3 4 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxVertexNum 1000
//邻接矩阵结构
typedef struct GNode1* PtrToGNode1;
struct GNode1 {
	int Nv;
	int Ne;
	int G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode1 MGraph;
int Visited1[MaxVertexNum];
//邻接表结构
typedef struct ENode* PtrToENode;
struct ENode {
	int V1, V2;
};
typedef PtrToENode Edge;
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {
	int AdjV;
	PtrToAdjVNode Next;
};
typedef struct Vnode {
	PtrToAdjVNode FirstEdge;
}AdjList[MaxVertexNum];
typedef struct GNode2* PtrToGNode2;
struct GNode2 {
	int Nv;
	int Ne;
	AdjList G;
};
typedef PtrToGNode2 LGraph;
int Visited2[MaxVertexNum];
//创建领接矩阵
MGraph CreateGraph1(int VertexNum) {
	int v, w;
	MGraph Graph = (MGraph)malloc(sizeof(struct GNode1));
	Graph->Nv = VertexNum;
	Graph->Ne = 0;
	for (v = 1; v <= Graph->Nv; v++) {
		Visited1[v] = 0;
		for (w = 1; w <= Graph->Nv; w++)
			Graph->G[v][w] = 0;
	}
	return Graph;
}
//在邻接矩阵中插入边
void InsertEdge1(MGraph Graph, int v1, int v2,int flag) {
	Graph->G[v1][v2] = 1;
	if(flag==0)Graph->G[v2][v1] = 1;
}
//遍历邻接矩阵
void display1(int Nv, MGraph Graph) {
	int i, j;
	for (i = 1; i <= Nv; i++) {
		for (j = 1; j <= Nv; j++) {
			printf("%d ", Graph->G[i][j]);
		}
		printf("\n");
	}
}
//创建领接表
LGraph CreateGraph2(int VertexNum) {
	int V;
	LGraph Graph2;
	Graph2 = (LGraph)malloc(sizeof(struct GNode2));
	Graph2->Nv = VertexNum;
	Graph2->Ne = 0;
	for (V = 0; V < Graph2->Nv; V++)
		Graph2->G[V].FirstEdge = NULL;
	return Graph2;
}
//在领接表中插入边
void InsertEdge2(LGraph Graph2, Edge E,int flag) {
	PtrToAdjVNode NewNode;
	NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
	NewNode->AdjV = E->V2;
	NewNode->Next = Graph2->G[E->V1].FirstEdge;
	Graph2->G[E->V1].FirstEdge = NewNode;
	if (flag == 0) {
		NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
		NewNode->AdjV = E->V1;
		NewNode->Next = Graph2->G[E->V2].FirstEdge;
		Graph2->G[E->V2].FirstEdge = NewNode;
	}
}
//遍历邻接表
void display2(int Nv,LGraph Graph2) {
	int i;
	PtrToAdjVNode w;
	for (int i = 0; i < Nv; i++) {
		printf("%d:", i);
		for (w = Graph2->G[i].FirstEdge; w; w = w->Next) {
			printf("%d ", w->AdjV);
		}
		printf("\n");
	}
}
int main() {
	int Nv, Ne;
	int v1, v2, q;
	int i, j, v,flag;
	scanf("%d%d%d", &Nv, &Ne,&flag);
	MGraph Graph1 = CreateGraph1(Nv);
	LGraph Graph2 = CreateGraph2(Nv);
	Edge E = (Edge)malloc(sizeof(struct ENode));
	if (Ne != 0) {
		Graph1->Ne = Ne;
		Graph2->Ne = Ne;
		for (i = 0; i < Graph1->Ne; i++) {
			scanf("%d%d", &v1, &v2);
			//邻接矩阵的边从1开始记,邻接表从0开始记
			E->V1 = v1-1;
			E->V2 = v2-1;
			InsertEdge1(Graph1, v1, v2,flag);
			InsertEdge2(Graph2, E, flag);
		}
	}
	display1(Nv, Graph1);
	display2(Nv, Graph2);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值