【算法与数据结构】图 -- 数组表示法

 

图的数组表示法

借助一个二维数组表示图,该二维数组的第i行,第j列的值表示Node[i]到Node[j]

无向图(网):是否有边 / 权值,arr[i][j] == arr[j][i],无向图(网)的特性,矩阵关于对角线对称。

有向图(网):是否有弧 / 权值。

 

复制代码
//图的数组表示法

//最大顶点个数
const int MAX_VERTEX = 100;

//最大值
const int MAX_VALUE = (1 << 31) - 1;

typedef struct _tagArcCell
{
    int   adj;        //无向网,权值
    char  character;  //顶点信息,字符
}ArcCell, ArcCell_ARRAY[MAX_VERTEX][MAX_VERTEX];

 

typedef struct _tagGraph 
{
    char vexs[MAX_VERTEX];       //顶点向量
    ArcCell_ARRAY arcCellArray;  //节点数组
    int nodeNum;                 //顶点数
    int edgeNum;                 //边数
}Graph;
复制代码

 

 

复制代码
//根据点,获取该点在图中的位置
int Locate(Graph& graph, char ch)
{
    for (int i = 0; i < graph.nodeNum; ++ i)
    {
        if (ch == graph.vexs[i])
        {
            return i;
        }
    }
    
    return -1;
}
复制代码

 

复制代码
void CreateGraph(Graph& graph)
{
    //初始化无向网的值
    int num = 0;

    cout << "请输入图的顶点个数"; 
    cin >> num;
    graph.nodeNum = num;

    cout << "请输入图的边数";
    cin >> num;
    graph.edgeNum = num; 

    cout << endl<<endl;
    cout<<"下面开始构造顶点向量"<<endl;

    for (int i = 0; i < graph.nodeNum; ++ i)
    {
        cout << "请输入每个顶点:";
        char ch = 0;
        cin >> ch;
        graph.vexs[i] = ch;
    }
    cout << "\r\n顶点向量构造完毕\r\n\r\n";


    cout << "下面开始初始化邻接矩阵\r\n";
    for (int i = 0; i < graph.nodeNum; ++ i)
    {
        for (int j = 0; j < graph.nodeNum; ++ j)
        {
            graph.arcCellArray[i][j].adj = MAX_VALUE;
        }
    }

    cout << "\r\n邻接矩阵初始化完毕\r\n\r\n";

    cout << "下面开始构造边,并为边分配权值\r\n";
    for (int i = 0; i < graph.edgeNum; ++ i)
    {
        cout << "请先输入一个顶点:";
        char ch = 0;
        cin >> ch;
        int nFrom = Locate(graph, ch);
        if (-1 == nFrom)
        {
            cout << "您输入的顶点不在此图上,请重新输入\r\n";
            -- i;
            continue;
        }
        cout << "请输入另一个顶点:";
        cin >> ch;
        int nTo = Locate(graph, ch);
        if (-1 == nTo)
        {
            cout << "您输入的顶点不在此图上,请重新输入本条边\r\n";
            -- i;
            continue;
        }

        int adj = 0; 
        cout << "请输入该边的权值:";
        cin >> adj;
        graph.arcCellArray[nFrom][nTo].adj = graph.arcCellArray[nTo][nFrom].adj = adj;
    }
    
    cout <<endl<< "构造边和权值结束"<<endl<<endl; 

}
复制代码

 

 

 

复制代码
int _tmain(int argc, _TCHAR* argv[])
{
    Graph graph;
    CreateGraph(graph);

    return 0;
}
复制代码

 

 

 

  

posted on   崔好好  阅读(2102)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示