邻接表
写这个主要是因为要学图论了,再不学就死翘翘了...
变量:
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 }

浙公网安备 33010602011771号