邻接表存图和遍历

101 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。​​ ​

  ​编辑

​编辑

#include<bits/stdc++.h>
using namespace std;
int main()
{///存图
    int n,m;///n个点,m条边
    int u[10],v[10],w[10];///起点,终点,边权值
    int first[10],next[10];///顶点表  边表
    scanf("%d %d",&n,&m);
    memset(first,-1,sizeof(first));
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&u[i],&v[i],&w[i]);
        ///读入每条边
        next[i]=first[u[i]];
        first[u[i]]=i;
    }
    
    ///遍历每个顶点的所有边
    for(int i=1;i<=n;i++)
    {
        int k=first[i];
        while(k!=-1)
        {
            printf("%d %d  %d\n",u[k],v[k],w[k]);
            k=next[k];
        }
    }
    return 0;
}

void add(int u,int v,int w)
{
    edge[cnt].w = w;
    edge[cnt].to = v;
    edge[cnt].next = head[u];//下一个节点指向当前节点的编号
    head[u] = cnt++;//cnt 记录总边数的编号
}

// head[u] 和 cnt 的初始值都为 -1
void add(int u, int v) {
  nxt[++cnt] = head[u];  // 当前边的后继
  head[u] = cnt;         // 起点 u 的第一条边
  to[cnt] = v;           // 当前边的终点
}

// 遍历 u 的出边
for (int i = head[u]; ~i; i = nxt[i]) {  // ~i 表示 i != -1
  int v = to[i];
}