使用邻接矩阵和邻接表存图的实现

其实已经在前面题解有提及,这里专门开一期。

 

邻接矩阵

适用于 Floyd 算法(Floyd 复杂度 O(n^3) )

    const int inf = 0x3f3f3f3f;
    // 初始化
    for (int i=1;i<numOfDots;i++)
        for (int j=1;j<=numOfDots;j++)
            if (i==j)             
                map[i][j] = 0; 
            else
                map[i][j] = inf;

 
    // 读入路径
    for (int i=1;i<=numOfLines;i++)
    {
        cin >> m >> n >> k;
        map[m][n] = k;
        // map[n][m] = k; 
        // 若双向边需同时赋值
    }

 

邻接表

int numOfDots,numOfLines;
// u,v,w 数组大小要根据实际大小设置,往往比 numOfLines 大 1.
int u[numOfLines+1],v[numOfLines+1],w[numOfLines+1];
// head,next 数组大小根据实际情况设置,往往比 numOfDots 大 1.
int head[numOfDots],next[numOfDots];

scanf("%d %d",&numOfDots,&numOfLines);
// 输入

// 初始化 head 数组下标 1-numOfDots 的值为 -1(不存在)

for (int i=1;i<=numOfDots;i++)
    head[i] = -1;

for (int i=1;i<=numOfLines;i++)
{
    scanf("%d %d %d",&u[i],&v[i],&w[i]);
    next[i] = head[u[i]];
    head[u[i]] = i;
    // Head数组存储的是以该点为起点(按照加入时间顺序)最后加入的一条边。
    // Next数组是以该边起始点为起点的上一条边(按照加入时间顺序)
}

 

posted @ 2018-02-12 19:35  soulwinter  阅读(206)  评论(0编辑  收藏  举报