数据结构——图的概念,图的存储结构,图的遍历(dfs,bfs)

目录

 1.图的定义和术语

2.案例引入 

1.六度空间理论

3.图的类型定义 

4.图的存储结构 

1.邻接矩阵 

1.无向图的邻接矩阵表示法 

2.有向图的邻接矩阵表示法

3.网(有权图)的邻接矩阵表示法 

代码示例:

 2.采用邻接矩阵表示法创建无向图

代码示例:

3.邻接表

1. 邻接表表示法(链式)

练习 

2.邻接表存储表示 

1.顶点的结点结构 

2.弧(边)的结点结构 

 3.图的结构定义

代码示例:

 3.邻接表操作举例

4.采用邻接表表示法创建无向网 

代码示例: 

5.邻接表特点 

 6.临界矩阵与邻接表表示法的关系

5.十字链表 (用于有向图)

6.邻接多重表 

7.图的遍历 

1.DFS 

代码示例:

 

2.BFS 

代码示例:

 

8.总的代码

 


f44133c10f694ede9f45f744bd23a20e.png

 1.图的定义和术语

964d8b6a8bc54874b2704b3d19d293d3.png

95d9415c60054508946b74822aa9b39d.png

dec5edf9c0c447549a2ac9ff681bd2f5.png

b16fd9378a28439f8e00ab7dcdd5cadf.png

23ee63770ee840a1b26a04209eb8686d.png

7ac4dde43de14de08cfa3d6c6fd53add.png

91c1a036eeda4f7088513004c4a1172c.png

9209f6435a764bc8ad8befd88e73fad2.png

50368c3bfeb34002852c3bfad298c8dc.png

ea56324548a044dea9c6fab7c6c82a59.png

a53878561ee84da99d149a59d00542bd.png

d8781a55de3d4621a51ce8bea3676f0c.png

ba361d1d8def49659d0dbfe1a03687be.png

2.案例引入 

1.六度空间理论

c7d1cdcf4af449d48f48d7f999826f17.png

52e5d5b0977f4b45a722f34c2e373de7.png

3.图的类型定义 

c9fa2ea936dd4c2c9fd33ed63f4490c1.png

26581768e66f4c74974442e584b4ef61.png

d9f0eca87b8746cc979062d552737cfe.png

50f76ab813f44c01b26f4b1ea94b2dcf.png

4.图的存储结构 

418632f0a0954eedb8196e62e689011f.png

1.邻接矩阵 

0df600a80b4743b0bb7b4ea0c0b6a53f.png

1.无向图的邻接矩阵表示法 

415d897bbc2a4c4aa78174939ba45b1e.png

2.有向图的邻接矩阵表示法

db649978dd9d4b319caa0a8f6f56e666.png

60c448b83f85493795933212ee9e3ad9.png

3.网(有权图)的邻接矩阵表示法 

bd283f5c020347dea6ac709bbbdf35eb.png

754589c5182a438a8f376577afd2cb2d.png

代码示例:

typedef struct{
	char vexs[100];
	int arcs[32767][32767];
	int vexnum,arcnum;
}amgraph;

 2.采用邻接矩阵表示法创建无向图

825f533e9c854ec2a10c03ffc2816186.png

7834e3d4bbaf423ea0e8bcb316d97b29.png

bb1cfa00ab5a43a8bfe9be4a3493b226.png

bca99be4b36c49f3927eb0b5fa243525.png

0f043c27c61b47019ca23a13565c6180.png

代码示例:
int locatevex(amgraph &g,char u)
{
	for(int i = 0; i < g.vexnum; i++)
	{
		if(u == g.vexs[i]) return i;
	}
	return -1;
}

int createudn(amgraph &g)
{
	cin >> g.vexnum >> g.arcnum;
	for(int i = 0; i < g.vexnum; i++)
	{
		cin >> g.vexs[i];
	}
	for(int i = 0; i < g.arcnum; i++)
		for(int j = 0; j < g.arcnum; j++)
			g.arcs[i][j] = 32767;
	for(int k = 0; k < g.arcnum; k++)
	{
		char v1,v2;
		int w;
		cin >> v1 >> v2 >> w;
		int i = locatevex(g,v1);
		int j = locatevex(g,v2);
		g.arcs[i][j] = w;
		g.arcs[j][i] = w;
	}
	return 1;
}

8de41b12972c4df6b76e56ffc7e94bbe.png

0d527c7f97ea4bcc89d1d457779dc27a.png

9464faa1bfe042d6830a57825d4642a5.png

3dee86b438dd4caca61f679733806fc9.png

d37b97846fc447d4b71780fcaf46548c.png

3.邻接表

1. 邻接表表示法(链式)

4820abfefa1d4bbcb135e8158a0ade75.png

337b42159d5e43c8b29a7bbe68fa772d.png

5653b60e0ecf4868b35d16eefc9b721e.png

8de1183c0e1847fcbc41413c4bd864cd.png546a2553e3f94db09fe1bb8a3d078a95.png 

练习 

7cc8f3d5f64b4f7b82291847030dbeed.png

2.邻接表存储表示 

90c00ca9d70a4bcc899e8fe46fa352fe.png

1.顶点的结点结构 

aaa55eea000740e1abd22ef53e5f2940.png

2.弧(边)的结点结构 

03daf8e6948b4df0a075f297e7ee4a73.png

 3.图的结构定义

80e3615fb3d44a2ca2c1e66ffe0fd7a9.png

代码示例:
#define mvnum 100
typedef struct arcnode{
	int adjvex;
	struct arcnode* nextarc;
	int info;
}arcnode;

typedef struct{
	char data;
	arcnode * firstarc;
}vnode,adjlist[mvnum];

typedef struct{
	adjlist vertices;
	int vexnum,arcnum;
}algraph;

 3.邻接表操作举例

8002240d86f64deab661ad85a06ca4d0.png

f056a70667c142558992491a57cdccf7.png

4.采用邻接表表示法创建无向网 

b2732bb9bb7a41d6833a1660cae00ec1.png

03b06ede43504c21be11b1c1e78d6ffe.png

代码示例: 
int createudg(algraph &g)
{
	cin >> g.vexnum >> g.arcnum;
	for(int i = 1; i <= g.vexnum; i++)
	{
		cin >> g.vertices[i].data;
		g.vertices[i].firstarc = NULL;
	}
	for(int k = 1; k <= g.arcnum; k++)
	{
		cin >> v1 >> v2;
		int i = locatevex(g,v1);
		int j = locatevex(g,v2);
		arcnode *p1;
		p1 = new arcnode;
		p1 -> adjvex = j;
		p1 -> nextarc = g.vertices[i].firstarc;
		g.vertices[i].firstarc = p1;
		arcnode *p2;
		p2 = new arcnode;
		p2 -> adjvex = i;
		p2 -> nextarc = g.vertices[j].firstarc;
		g.vertices[j].firstarc = p2;
	}
	return 1;
}

e439ba69fb9847e5a7a89d3f8e0672ed.png

5.邻接表特点 

5c4595d39793418fb58833f8be74b28d.png

 6.临界矩阵与邻接表表示法的关系

8a8ea1597948495fa07718c2b0219112.png

d452b5d1491f48c3aa596aaabaae3a34.png

fc92bf5db44d41cfa25ac41d260d5d4e.png

5.十字链表 (用于有向图)

3d283bc3358a43baabce10bdb04e2da0.png

f51faf24427047be852973d3fc0c0621.png

66a4ab714c6942209a6b0d29eb9ad5a9.png

95b2c2453780409691e0cf6e8f620278.png

6.邻接多重表 

34b6f387117440f0a466d86b0f54363b.png

290ddde0416440a3b4dcfce9cba41018.png

7.图的遍历 

0c75b6b0e21a4f62a997fb9b2f99bf87.png

c601023bd91c4eb3b4d8b1d6026355ac.png

fde334242045472a8d3bcd4c54a1f380.png

3564543379dc453caa09c80cc82113f9.png

1.DFS 

8d017db39aa3425fac104ee14f0d81cf.png

190596237c21426287dee5d777e68578.png

3600b143e0754352acf84e2ddb469df1.png

bfcac09ab48b4a31bcafd78ad7465d44.png

ad8dc386bc7a436883a030ef03cd78ac.png

8be6b3b107c0431ca87bd9a59f91ce94.png

c3793886300643ae834e0d40a548d2c5.png

99eba6f3e85f4922a57b49d4b14d01a4.png

代码示例:
void dfs(amgraph g,int v)
{
	cout << v;
	visited[v] = true;
	for(int w = 0; w < g.vexnum; w++)
	{
		if(g.arcs[v][w] != 0 && !visited[w]) dfs(g,w);
	}
}

223a92d1b2f248639cbfbcf10eb003f6.png

e07d5d53c9d540f69e652fcc3d25fde5.png

2.BFS 

a45533d14c4a41f39b1fe426975fd208.png  

9f67a8e02fbc4a699dcd12be0bd29465.png

fba45f88168d49a8952be1431aa738f8.png

d2a0dea65e9340c69a0113d87624e733.png

94d3adff4ded437ea19b79b0ba342677.png

35904070fdbe420da562202205b00e8a.png

578bc081a3df4dfa8e354346d9edf6db.png

代码示例:
void bfs(graph g,int v)
{
	cout << v;
	visited[v] = true;
	initqueue(q);
	enqueue(q,v);
	while(!queueempty(q))
	{
		dequeue(q,u);
	}
	for(int w = firstadjvex(g,u); w > 0; w = nextadjvex(g,u,w))
	{
		if(!visited[w])
		{
			cout << w;
			visited[w] = true;
			enqueue(q,w);
		}
	}
}

20bc1fef977f405ca3690d04bebd7108.png

6076dab76b504907b044e818bb01accf.png

8.总的代码

#include <iostream>
using namespace std;

typedef struct{
	char vexs[100];
	int arcs[32767][32767];
	int vexnum,arcnum;
}amgraph;

int locatevex(amgraph &g,char u)
{
	for(int i = 0; i < g.vexnum; i++)
	{
		if(u == g.vexs[i]) return i;
	}
	return -1;
}

int createudn(amgraph &g)
{
	cin >> g.vexnum >> g.arcnum;
	for(int i = 0; i < g.vexnum; i++)
	{
		cin >> g.vexs[i];
	}
	for(int i = 0; i < g.arcnum; i++)
		for(int j = 0; j < g.arcnum; j++)
			g.arcs[i][j] = 32767;
	for(int k = 0; k < g.arcnum; k++)
	{
		char v1,v2;
		int w;
		cin >> v1 >> v2 >> w;
		int i = locatevex(g,v1);
		int j = locatevex(g,v2);
		g.arcs[i][j] = w;
		g.arcs[j][i] = w;
	}
	return 1;
}

#define mvnum 100
typedef struct arcnode{
	int adjvex;
	struct arcnode* nextarc;
	int info;
}arcnode;

typedef struct{
	char data;
	arcnode * firstarc;
}vnode,adjlist[mvnum];

typedef struct{
	adjlist vertices;
	int vexnum,arcnum;
}algraph;

int createudg(algraph &g)
{
	cin >> g.vexnum >> g.arcnum;
	for(int i = 1; i <= g.vexnum; i++)
	{
		cin >> g.vertices[i].data;
		g.vertices[i].firstarc = NULL;
	}
	for(int k = 1; k <= g.arcnum; k++)
	{
		cin >> v1 >> v2;
		int i = locatevex(g,v1);
		int j = locatevex(g,v2);
		arcnode *p1;
		p1 = new arcnode;
		p1 -> adjvex = j;
		p1 -> nextarc = g.vertices[i].firstarc;
		g.vertices[i].firstarc = p1;
		arcnode *p2;
		p2 = new arcnode;
		p2 -> adjvex = i;
		p2 -> nextarc = g.vertices[j].firstarc;
		g.vertices[j].firstarc = p2;
	}
	return 1;
}

void dfs(amgraph g,int v)
{
	cout << v;
	visited[v] = true;
	for(int w = 0; w < g.vexnum; w++)
	{
		if(g.arcs[v][w] != 0 && !visited[w]) dfs(g,w);
	}
}

void bfs(graph g,int v)
{
	cout << v;
	visited[v] = true;
	initqueue(q);
	enqueue(q,v);
	while(!queueempty(q))
	{
		dequeue(q,u);
	}
	for(int w = firstadjvex(g,u); w > 0; w = nextadjvex(g,u,w))
	{
		if(!visited[w])
		{
			cout << w;
			visited[w] = true;
			enqueue(q,w);
		}
	}
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 11:36:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 11:36:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 11:36:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 11:36:02       20 阅读

热门阅读

  1. python项目练习——14.学生管理系统

    2024-04-06 11:36:02       17 阅读
  2. B3799 [NICA #1] 序列

    2024-04-06 11:36:02       17 阅读
  3. P8783 [蓝桥杯 2022 省 B] 统计子矩阵

    2024-04-06 11:36:02       16 阅读
  4. 关于人员的管理问题小讨论

    2024-04-06 11:36:02       15 阅读
  5. spring 和spring boot的区别

    2024-04-06 11:36:02       15 阅读
  6. C/C++中const关键字用法总结

    2024-04-06 11:36:02       17 阅读
  7. springcloud第4季 使用resilience4j实现服务流量治理

    2024-04-06 11:36:02       15 阅读