美文网首页
网易:遍历有向图(邻接表)中的每一个子图

网易:遍历有向图(邻接表)中的每一个子图

作者: lxr_ | 来源:发表于2022-09-03 19:01 被阅读0次

//遍历有向图(邻接表)中的每一个子图并计算权值(子图中的每一个结点权值相乘)

#include <iostream>
#include <string>
#include<vector>
using namespace std;

#define MAXVEX 100
typedef int VertexType;        //顶点类型
typedef int EdgeType;           //边上的权值类型

struct EdgeNode                 //边表结点
{
    int adjvex;                 //邻接点域,存储该节点对应的下标

    EdgeType weight;            //存储权值,非网图不需要
    EdgeNode* next;             //下一个邻接点
};

typedef struct VertexNode
{
    VertexType data;            //顶点

    EdgeNode* firstEdge;        //边表头指针
}AdjList[MAXVEX];               //顶点数组

struct GraphAdjList
{
    AdjList adjList;            //顶点数组
    int numVertexes, numEdges;  //实际图中顶点数和边数
};


bool* visited;
static vector<int> weight;
int w = 1;
void DFS(GraphAdjList G, int v)
{

    w *= G.adjList[v].data;
    //cout << G.adjList[v].data << " ";                       //输出顶点名称
    visited[v] = true;

    EdgeNode* p = G.adjList[v].firstEdge;                   //顶点的第一条边
    while (p)
    {
        if (!visited[p->adjvex])
        {
            DFS(G, p->adjvex);
        }
        p = p->next;
    }
}

//根据顶点名称查找其下标
int locateVertex(GraphAdjList G, VertexType v)
{
    for (int i = 0; i < G.numVertexes; i++)
    {
        if (v == G.adjList[i].data)
        {
            return i;
        }
    }
    return -1;
}

static void yinzi()
{
    int count = 0;
    for (int i = 0; i < weight.size(); i++)
    {
        for (int j = 1; j * j <= weight[i]; j++)
        {
            if (weight[i] % j == 0)
            {
                count++;
                if (j != weight[i] / j)
                {
                    count++;
                }
            }

        }
    }
    cout << count << endl;
}
int main()
{
    //建立有向图的邻接矩阵
    GraphAdjList G;
    cin >> G.numVertexes;
    G.numEdges = G.numVertexes - 1;
    visited = new bool[G.numVertexes];
    for (int i = 0; i < G.numVertexes; i++)
    {
        visited[i] = false;                         //初始化为false
    }

    //输入顶点
    for (int i = 0; i < G.numVertexes; i++)
    {
        cin >> G.adjList[i].data;
        G.adjList[i].firstEdge = NULL;
    }
    //输入边
    VertexType vertex1, vertex2;
    int m, n;
    int edge = 1;
    for (int i = 0; i < G.numEdges; i++)
    {
        cin >> vertex1 >> vertex2;      //输入边及其依附的两个顶点

        m = locateVertex(G, vertex1);           //弧的起点
        n = locateVertex(G, vertex2);           //弧的终点

        if (m >= 0 && n >= 0)
        {
            //创建一个新的边结点
            EdgeNode* e = new EdgeNode;
            e->weight = edge;
            e->adjvex = n;
            e->next = G.adjList[m].firstEdge;   //头插法插入顶点的firstedge
            G.adjList[m].firstEdge = e;

        }
    }

    for (int i = 0; i < G.numVertexes; i++)   //每个顶点遍历一遍
    {
        w = 1;
        if (!visited[i])
        {
            DFS(G, i);
        }
        weight.push_back(w);

        //cout << endl;
        for (int j = 0; j < G.numVertexes; j++)
        {
            visited[j] = false;                 //复位访问标志位false
        }
    }

    yinzi();

    return 0;
}

相关文章

  • 网易:遍历有向图(邻接表)中的每一个子图

    //遍历有向图(邻接表)中的每一个子图并计算权值(子图中的每一个结点权值相乘)

  • 数据结构-学习二

    图: 无向图,有向图度,子图,路径,环,连通图,连通子图。 存储: 邻接矩阵二维数组。 邻接表+数组加链表优先搜...

  • 面试准备之【数据结构】1——图

    一. 有向图/无向图 共有:邻接表,邻接矩阵 有向图独有:十字链表,边集数组 无向图独有:邻接多重表 1.邻接矩...

  • 数据结构-图

    数据结构 - 图 目录: 基本概念无向图有向图 储存结构邻接矩阵邻接表十字链表(有向图)邻接多重表(无向图) 图的...

  • 图的遍历

    1.采用深度优先搜索(DFS)遍历图 邻接矩阵: 邻接表: 2.采用广度优先搜索(BFS)遍历图 邻接矩阵: 邻接...

  • 第七章 图

    邻接表定义 邻接表求各点入度 邻接表各点出度 DFS与BFS遍历 已知一个无向图G的邻接表存储表示如下,试写出从顶...

  • Java数据结构 - 图(邻接表存储)

    邻接表 相比邻接矩阵,邻接表要更加节省空间。 邻接表存储 本文将介绍邻接表存储有向带权图。图的例子如下。 介绍一下...

  • 图的表示和存储结构

    图的表示:两种表示方法 邻接矩阵和邻接表 无向图 有向图 图的权 连通图 度 图的存储结构 1、邻接矩阵存储 浪...

  • 5 图的复习目录

    5.1 图 5.2 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重链表 5.3 图的遍历 深度优先 广...

  • 基本的数据结构有哪些

    图: 有向图:无向图: 图的存储结构:1,邻接矩阵(数组表达)2,邻接表和十字链表,链表表达,主要表达有向图3,邻...

网友评论

      本文标题:网易:遍历有向图(邻接表)中的每一个子图

      本文链接:https://www.haomeiwen.com/subject/qdumnrtx.html