帮我写个代码:用C语言编程实现下列程序: 1.初始化邻接矩阵表示的无向图。 2.实现无向图的深度优先遍历。 3.实现无向图的广度优先遍历 4.用prim算法求最小生成树
时间: 2024-03-10 13:47:07 浏览: 77
好的,以下是代码实现:
1.初始化邻接矩阵表示的无向图。
```c
#include <stdio.h>
#define MAXVEX 100
#define INFINITY 65535
typedef struct
{
int vexs[MAXVEX]; // 存储顶点
int arc[MAXVEX][MAXVEX]; // 邻接矩阵,可看作边
int numVertexes, numEdges; // 图中当前的顶点数和边数
} MGraph;
void CreateMGraph(MGraph *G)
{
int i, j;
// 输入顶点数和边数
printf("请输入顶点数和边数:\n");
scanf("%d,%d", &G->numVertexes, &G->numEdges);
// 初始化邻接矩阵
for (i = 0; i < G->numVertexes; i++)
{
for (j = 0; j < G->numVertexes; j++)
{
if (i == j)
G->arc[i][j] = 0; // 顶点与自己的距离为0
else
G->arc[i][j] = INFINITY; // 初始化为无穷大
}
}
// 输入边的两个顶点及权值
for (i = 0; i < G->numEdges; i++)
{
int v1, v2, w;
printf("请输入边(vi, vj)的下标i、j和权值w:\n");
scanf("%d,%d,%d", &v1, &v2, &w);
G->arc[v1][v2] = w; // 无向图的邻接矩阵具有对称性
G->arc[v2][v1] = w;
}
}
```
2.实现无向图的深度优先遍历。
```c
int visited[MAXVEX];
void DFS(MGraph G, int i)
{
int j;
visited[i] = 1;
printf("%d ", G.vexs[i]); // 打印顶点
for (j = 0; j < G.numVertexes; j++)
{
if (G.arc[i][j] == 1 && !visited[j])
DFS(G, j);
}
}
void DFSTraverse(MGraph G)
{
int i;
for (i = 0; i < G.numVertexes; i++)
visited[i] = 0;
for (i = 0; i < G.numVertexes; i++)
{
if (!visited[i])
DFS(G, i);
}
}
```
3.实现无向图的广度优先遍历。
```c
int visited[MAXVEX];
void BFS(MGraph G, int i)
{
int j;
int queue[MAXVEX], front = 0, rear = 0;
printf("%d ", G.vexs[i]);
visited[i] = 1;
queue[rear++] = i;
while (front != rear)
{
int k = queue[front++];
for (j = 0; j < G.numVertexes; j++)
{
if (G.arc[k][j] == 1 && !visited[j])
{
printf("%d ", G.vexs[j]);
visited[j] = 1;
queue[rear++] = j;
}
}
}
}
void BFSTraverse(MGraph G)
{
int i;
for (i = 0; i < G.numVertexes; i++)
visited[i] = 0;
for (i = 0; i < G.numVertexes; i++)
{
if (!visited[i])
BFS(G, i);
}
}
```
4.用prim算法求最小生成树。
```c
typedef struct
{
int adjvex;
int lowcost;
} closedge[MAXVEX];
void MiniSpanTree_Prim(MGraph G, int u)
{
int i, j, k, min;
closedge close;
for (i = 0; i < G.numVertexes; i++)
{
close[i].lowcost = G.arc[u][i];
close[i].adjvex = u;
}
close[u].lowcost = 0;
for (i = 1; i < G.numVertexes; i++)
{
min = INFINITY;
for (j = 0; j < G.numVertexes; j++)
{
if (close[j].lowcost != 0 && close[j].lowcost < min)
{
min = close[j].lowcost;
k = j;
}
}
printf("(%d,%d) ", close[k].adjvex, k);
close[k].lowcost = 0;
for (j = 0; j < G.numVertexes; j++)
{
if (G.arc[k][j] < close[j].lowcost)
{
close[j].lowcost = G.arc[k][j];
close[j].adjvex = k;
}
}
}
}
```
以上代码实现了无向图的初始化、深度优先遍历、广度优先遍历和prim算法求最小生成树。
阅读全文