图的建立的两种方法(领接矩阵,领接表)
//图的建立的实现->邻结矩阵和邻结表两种表示方法
#include <cstdio>
#include <cstdlib>
//#define _OJ_
typedef struct Graph1
{
int nv;
int ne;
int elem[100][100];
} Graph1, *Graph;
typedef struct Edge1
{
int v1, v2;
// int weight;权重
} Edge1, *Edge;
Graph
creat_graph(int vertex, int edge2)
{
int i, j;
Graph g;
g = (Graph) malloc (sizeof(Graph1));
g->nv = vertex;
g->ne = edge2;
for(i = 0;i < vertex; i++) {
for(j = 0;j < vertex; j++) {
g->elem[i][j] = 0;
}
}
return g;
}
void
inser_v(Graph g, int v1, int v2)
{
g->elem[v1][v2] = 1;
g->elem[v2][v1] = 1;//无向图则要写两个 == 1, 或者 == weight
}
Graph
build_graph(void)
{
Graph g;
Edge e;
int nv, ne, i;
scanf("%d %d", &nv, &ne);
g = creat_graph(nv,ne);
if(ne > 0) {
e = (Edge) malloc (sizeof(Edge1));
for(i = 0;i < ne; i++) {
scanf("%d %d", &e->v1, &e->v2);
inser_v(g, e->v1, e->v2);
}
}
return g;
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int i, j;
Graph g;
g = build_graph();
for(i = 0;i < g->nv; i++) {
for(j = 0;j < g->nv; j++) {
printf("%d ", g->elem[i][j]);
}
printf("\n");
}
return 0;
}
更为简单的一种方法如下
// --------------------------------------------------------------------------------
// 更为简单的方法
int elem[100][100];
int i, j, nv, ne, v1, v2;
scanf("%d %d", &nv, &ne);
for(i = 0;i < nv; i++) {
for(j = 0;j < nv; j++) {
elem[i][j] = 0;
}
}
for(i = 0;i < ne; i++) {
scanf("%d %d", &v1, &v2);
elem[v1][v2] = 1; elem[v2][v1] = 1;
}
----------------------------------------------------------------------------------------------------------------------
利用邻接表建立图
| Firstcell-> | nextnode-> | next-> | null |
| firstcell-> | nextnode-> | null | |
| firstcell-> | nextnode-> | null | |
| firstcell-> | nextnode-> | next-> | null |
---------------------------------------------------------------------------------------------------------------------------------------------
//图的建立的实现->邻结矩阵和邻结表两种表示方法以及深度遍历
#include <cstdio>
#include <cstdlib>
//#define _OJ_
int visit[100];
typedef struct Lnode
{
int data; //邻结点的位置下标
// int weight;
struct Lnode *next; //表由多排的链表组成
} Lnode, *Linklist;
typedef struct Fnode
{
int elem; //每个顶点的信息 是数字或是字符
Linklist firstcell; //构成多个头节点
} Fnode1[100];
typedef struct Graph1
{
int nv;
int ne;
Fnode1 G; //图由顶点数,边数,和邻接表组成
} Graph1, *Graph;
typedef struct Edge1
{
int v1;
int v2;
// int weight; //边由两个顶点的值构成
} Edge1, *Edge;
Graph
creat_graph(int vertex, int edge)
//分配边数和节点数并初始化
{
int i;
Graph g;
g = (Graph) malloc (sizeof(Graph1));
g->nv = vertex;
g->ne = edge;
for(i = 0;i < vertex; i++) {
g->G[i].firstcell = NULL; //把每一个头接点赋初值
g->G[i].elem = i; //输入每个节点的信息
}
return g;
}
void
inser_edge(Graph g, Edge e)
{
Linklist L, L1;
L = (Linklist) malloc (sizeof(Lnode));
L->data = e->v2;
L->next = g->G[e->v1].firstcell;
g->G[e->v1].firstcell = L;
//无向图的插入两边 每次增加一个节点将其插入在最前面
L1 = (Linklist) malloc (sizeof(Lnode));
L1->data = e->v1;
L1->next = g->G[e->v2].firstcell;
g->G[e->v2].firstcell = L1;
}
Graph
build_Graph(void)
{
Graph g;
Edge e;
int i, j, vertex, edge;
scanf("%d %d", &vertex, &edge);
g = creat_graph(vertex, edge);
if(edge > 0) {
e = (Edge) malloc (sizeof(Edge1));
for(i = 0;i < edge; i++) {
scanf("%d %d", &e->v1, &e->v2);
inser_edge(g, e);
}
return g;
}
}
void
DFS(Graph g, int v)
{
int i;
visit[v] = 1;
printf("%d ", g->G[v].elem);
while (g->G[v].firstcell->next != NULL) {
if(visit[g->G[v].firstcell->data] == 0)
DFS(g, g->G[v].firstcell->data);
g->G[v].firstcell = g->G[v].firstcell->next;
}
}
void
BFS_travers(Graph g)
{
int i;
for(i = 0;i < g->nv; i++)
visit[i] = 0;
for(i = 0;i < g->nv; i++)
if(visit[i] == 0) DFS(g, i);
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int i, j;
Graph g;
g = build_Graph(); // printf("%d %d\n", g->nv, g->ne);
// for(i = 0;i < g->nv; i++) {
// //printf("%p\n", g->G[i].firstcell); //循环重复的遍历每一条链表
// printf("%d -> ", i);
// while (g->G[i].firstcell != NULL) {
// printf("%d ",g->G[i].firstcell->data);
// g->G[i].firstcell = g->G[i].firstcell->next;
// }
// printf("\n");
// }
BFS_travers(g);
return 0;
}
/*
9 10
0 1
1 2
2 3
1 4
0 4
0 8
8 5
5 4
5 6
6 7
0 -> 8 4 1
1 -> 4 2 0
2 -> 3 1
3 -> 2
4 -> 5 0 1
5 -> 6 4 8
6 -> 7 5
7 -> 6
8 -> 5 0 建立无误
*/

浙公网安备 33010602011771号