邻接表

写这个主要是因为要学图论了,再不学就死翘翘了...

变量:

u[i],v[i],w[i]:u[i]、v[i]和w[i]表示第i条边是从第u[i]号顶点到v[i]号顶点(u[i]—>v[i]),且权值为w[i]。

first[i]:每个顶点其中一条边的编号(可以理解为遍历的起点)

next[i]:编号为i的边的前一条边的编号。

建图:

 

int n,m,i;
//u、v和w的数组大小要根据实际情况来设置,要比m的最大值要大1
int u[6],v[6],w[6];
//first和next的数组大小要根据实际情况来设置,要比n的最大值要大1
int first[5],next[5];
scanf("%d %d",&n,&m);
//初始化first数组下标1~n的值为-1,表示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]);//读入每一条边
    //下面两句是关键啦
    next[i]=first[u[i]]; //更新编号为i边的上一条边    
   first[u[i]]=i;//更新以u[i]为顶点的第一条边,实质上就是在链表末端插入新的元素
}

 

遍历过程:

for(i=1;i<=n;i++)
2 {
3     k=first[i];
4     while(k!=-1)
5     {
6         printf("%d %d %d\n",u[k],v[k],w[k]);
7         k=next[k];//找到下一条边的编号
8     }
9 }

 

posted @ 2021-01-31 21:16  爆零王  阅读(60)  评论(0)    收藏  举报