6-2 求采用邻接矩阵作为存储结构的无向图各顶点的度

本题要求实现一个函数,输出无向图每个顶点的数据元素的值,以及每个顶点度的值。

函数接口定义:

void degree(MGraph G);

G为采用邻接矩阵作为存储结构的无向图。

裁判测试程序样例:

#include <stdio.h>
#define MVNum 100                 //最大顶点数 
typedef struct{ 
  char vexs[MVNum];           //存放顶点的一维数组 
  int arcs[MVNum][MVNum];     //邻接矩阵 
  int vexnum,arcnum;          //图的当前顶点数和边数 
}MGraph; 
void degree(MGraph G);
void CreatMGraph(MGraph *G);/* 创建图 */
int main()
{
    MGraph G;
    CreatMGraph(&G);
    degree(G);
    return 0;
}
void CreatMGraph(MGraph *G)
{
    int i,j,k;
    scanf("%d%d",&G->vexnum,&G->arcnum);
    getchar();
    for(i=0;i<G->vexnum;i++)
       scanf("%c",&G->vexs[i]);
    for(i=0;i<G->vexnum;i++)
       for(j=0;j<G->vexnum;j++)
            G->arcs[i][j]=0;
    for(k=0;k<G->arcnum;k++)
    {  
       scanf("%d%d",&i,&j);     
       G->arcs[i][j]=1; 
       G->arcs[j][i]=1; 
    }
}

/* 请在这里填写答案 */

输入样例:

例如无向图

第一行给出图的顶点数n和边数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条边的两个顶点编号。

4 5
ABCD
0 1
0 2
1 2
1 3
2 3

输出样例:

输出n个顶点的元素值,顶点的数据类型为字符型。以及各顶点的度值

A:2
B:3
C:3
D:2

答案:

void degree(MGraph G)
{
    for (int i = 0; i < G.vexnum; i++)
    {
        int jk = 0;
        for (int j = 0; j < G.vexnum; j++)
            if (G.arcs[i][j] == 1)
                jk++;
        printf("%c:%d\n", G.vexs[i], jk);
    }
}

 

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵存储图: 邻接矩阵是用一个二维数组表示的图,数组中每个元素表示两个顶点之间是否存在一条边。如果两个顶点之间存在边,则该元素的值为1,否则为0。在无向图中,邻接矩阵是对称的,即A[i][j]=A[j][i]。 下面是使用邻接矩阵存储图的DFS和BFS算法实现: ``` // DFS算法实现 void DFS(int v, int visited[], int n, int A[][n]) { visited[v] = 1; // 标记当前节点已被访问 printf("%d ", v); for (int i = 0; i < n; i++) { // 遍历当前节点的所有邻居 if (A[v][i] == 1 && visited[i] == 0) { DFS(i, visited, n, A); // 递归访问邻居节点 } } } // BFS算法实现 void BFS(int s, int n, int A[][n]) { int visited[n]; memset(visited, 0, sizeof(visited)); // 初始化visited数组 queue<int> q; visited[s] = 1; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); printf("%d ", v); for (int i = 0; i < n; i++) { if (A[v][i] == 1 && visited[i] == 0) { visited[i] = 1; q.push(i); } } } } ``` 邻接表存储图: 邻接表是由一个数组和若干个链表组成的数据结构,数组中每个元素对应一个顶点,链表中存储该顶点的所有邻居。在链表中,每个节点表示一个邻居,包含两个字段:邻居节点的编号和指向下一个邻居节点的指针。 下面是使用邻接表存储图的DFS和BFS算法实现: ``` // DFS算法实现 void DFS(int v, int visited[], vector<int> adj[]) { visited[v] = 1; // 标记当前节点已被访问 printf("%d ", v); for (auto u : adj[v]) { // 遍历当前节点的所有邻居 if (visited[u] == 0) { DFS(u, visited, adj); // 递归访问邻居节点 } } } // BFS算法实现 void BFS(int s, vector<int> adj[]) { int visited[adj.size()]; memset(visited, 0, sizeof(visited)); // 初始化visited数组 queue<int> q; visited[s] = 1; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); printf("%d ", v); for (auto u : adj[v]) { if (visited[u] == 0) { visited[u] = 1; q.push(u); } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值