输出给定图的邻接矩阵和邻接表。
输入格式:
输入第一行给出三个正整数,分别表示无向图的节点数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;
}