加载中...

图储存

数组表示邻接表储存图

//n表示顶点个数,m表示边的条数
int n,m,i;
//u,v,w大小要比m最大值大1
int u[6],v[6],w[6];
//first,next大小要比n最大值大1,
//因为u[i]代表的是一条边的起始端点,可以到5
int first[5],next[5];
scanf("%d %d",&n,&m);
//初始化first,表示1~n顶点暂时都没有边
for(i=1; i<=n; i++)
    first[i]=-1;


for(i=1; i<=m; i++)
{
    //读入每一条边
    scanf("%d %d %d",&u[i],&v[i],&w[i])

    //u[i]代表起点,也说明u[i]这一点有了一条边
    //first[i]数组,其实储存的是最后一次以i为起点的边在uvw中的位置
    //如果不为-1,则继续找next[first[i]],即下一个节点,操作,直到next[k]为-1
    //next[i]数组储存下一个以i为起点的边在uvw中的位置
    next[i]=first[u[i]];
    first[u[i]]=i;
}

k=first[1]
  while(k!=-1)
{
    cout<<u[k]<<v[k]<<w[k];
    k=next[k];
}

//遍历每个顶点的边
for(i=1; i<=n; i++)
{
    k=first[i];
    while(k!=-1)
    {
        cout<<u[k]<<v[k]<<w[k];
        k=next[k];
    }

}

/*
4 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7
*/

posted @ 2022-09-24 16:33  biubidio  阅读(21)  评论(0)    收藏  举报