基础图论——邻接链表(利用数组建立)

#include <iostream>
#include <cstdio>
using namespace std;
int nxt[100], ver[100], head[100], dist[100];
//如果用next会名字空间冲突
int tot = 0;
void add(int x, int y, int z)
{
    ver[++tot] = y;
    nxt[tot] = head[x];
    head[x] = tot;
    dist[tot] = z;
}
void fun(int u)
{
    for (int i = head[u]; i != 0; i = nxt[i])
    {
        cout << u << "->" << ver[i] << " "
             << "distance is:" << dist[i] << endl;
    }
}
int main()
{
    add(1, 2, 1);
    add(1, 3, 2);
    add(2, 3, 4);
    add(3, 1, 5);
    fun(1);
    int m;
    cin>>m;
    return 0;
}
 
 
方法2:
创建结构体建立数组

//邻接链表(链表实现)没有指针,只不过这里少开了一个数组,放到了结构体变量中而已,更容易理解

struct nds{

    int y;

    int nxt;    //比起之前的那种邻接链表,少开了一个数组而已(nxt)

};

nds e[2100];

int lk[2100],ltp;

void ist(int x,int y){

    e[++ltp]={y,lk[x]};//这里记录终点和lk的上一个位置

    lk[x]=ltp;//更新lk记录的位置

    e[++ltp]={x,lk[y]};//无向边,所以这里处理两次

    lk[y] = ltp;  //更新lk记录的位置

}

void fun(int u){    //输出u节点对应的每个终点的位置

    for (int i = lk[u]; i!=0; i =e[i].nxt){

        cout << u << "->" << e[i].y<<endl;

    }

}

//请一定学会自己寻找乐趣!

// dfs遍历邻接矩阵:

bool f[2100];

void dfs(int x) //x在这里表示图上的节点

{

    if (f[x])

        return;

    f[x] = true; //记忆化

    for (int i = 1; i <= n; ++i)

        if (e[x][i])

            //注意这里是对一行扫描

    dfs(i); //接着由i走

}

// bfs遍历邻接链表:

int q[2100],hd=0;   hd是队尾,q是队列

bool f[2100];//记忆化

void bfs(){

    q[hd=1]=1;//队列中第一个为1号节点

    for(int k=1;k<=hd;++k){

        for(int i=lk[q[k]];i!=0;i=e[i].nex)

            if(!f[e[i].y]){

                q[++hd]=e[i].y;//继续入队

                f[e[i].y]=true;

            }

    }

}

 

// dfs遍历邻接链表:

void dfs(int x){

    if(f[x]) return ;

    f[x]=true;

    cout<<x<<" ";

    for(int i=lk[x];i!=0;i=e[i].nxt){

        dfs(e[i].y);

    }

    //这里函数执行完,也会自动结束

}

这篇文章,是又一个故事的结束...
lazy's story is continuing.
原文地址:https://www.cnblogs.com/Hello-world-hello-lazy/p/14408160.html