zoukankan      html  css  js  c++  java
  • 链式前向星

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1005;//点数最大值
    int n, m, cnt;//n个点,m条边
    struct Edge
    {
        int to, w, next;//终点,边权,同起点的上一条边的编号
    }edge[maxn];//边集
    int head[maxn];//head[i],表示以i为起点的第一条边在边集数组的位置(编号)
    void init()//初始化
    {
        for (int i = 0; i <= n; i++) head[i] = -1;
        cnt = 0;
    }
    void add_edge(int u, int v, int w)//加边,u起点,v终点,w边权
    {
        edge[cnt].to = v; //终点
        edge[cnt].w = w; //权值
        edge[cnt].next = head[u];//以u为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号
        head[u] = cnt++;//更新以u为起点上一条边的编号
    }
    int main()
    {
        cin >> n >> m;
        int u, v, w;
        init();//初始化
        for (int i = 1; i <= m; i++)//输入m条边
        {
            cin >> u >> v >> w;
            add_edge(u, v, w);//加边
            /*
            加双向边
            add_edge(u, v, w);
            add_edge(v, u, w);
            */
        }
        for (int i = 1; i <= n; i++)//n个起点
        {
            cout << i << endl;
            for (int j = head[i]; j != -1; j = edge[j].next)//遍历以i为起点的边
            {
                cout << i << " " << edge[j].to << " " << edge[j].w << endl;
            }
            cout << endl;
        }
        return 0;
    }
    /*
    5 7
    1 2 1
    2 3 2
    3 4 3
    1 3 4
    4 1 5
    1 5 6
    4 5 7
    */

    对于1 2 1这条边:edge[0].to = 2;     edge[0].next = -1;      head[1] = 0;

    对于2 3 2这条边:edge[1].to = 3;     edge[1].next = -1;      head[2] = 1;

    对于3 4 3这条边:edge[2].to = 4;     edge[2],next = -1;      head[3] = 2;

    对于1 3 4这条边:edge[3].to = 3;     edge[3].next = 0;       head[1] = 3;

    对于4 1 5这条边:edge[4].to = 1;     edge[4].next = -1;      head[4] = 4;

    对于1 5 6这条边:edge[5].to = 5;     edge[5].next = 3;       head[1] = 5;

    对于4 5 7这条边:edge[6].to = 5;     edge[6].next = 4;       head[4] = 6;

    第一层for循环是找每一个点,依次遍历以【1,n】为起点的边的集合。第二层for循环是遍历以 i 为起点的所有边,k首先等于head[ i ],注意head[ i ]中存的是以 i 为起点的最后一条边的编号。然后通过edge[ j ].next来找下一条边的编号。我们初始化head为-1,所以找到你最后一个边(也就是以 i 为起点的第一条边)时,你的edge[ j ].next为 -1做为终止条件。

  • 相关阅读:
    疫情控制
    数据结构1
    NOIP 模拟 921
    ml-agents项目实践(一)
    Appium的安装及简单的使用介绍
    移动设备管理平台的搭建(基于STF/ATXServer2)
    ClickHouse利器—如何提高留存计算速度
    Linux基本操作命令
    深度学习与强化学习的两大联姻:DQN与DDPG的对比分析
    漏洞扫描软件AWVS的介绍和使用
  • 原文地址:https://www.cnblogs.com/Chri-K/p/13912715.html
Copyright © 2011-2022 走看看