代码如下:
/*
4 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7
*/
#include<stdio.h>
int main()
{
const int MAXV=10;
int n,m,i;
int u[6],v[6],w[6];//大于等于m+1
int first[5],next[6];//大于等于n+1,大于等于m+1
scanf("%d %d",&n,&m);
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]];//先记录下来当前点存的边
first[u[i]]=i;//更新当前点记录的边
}
int k;
//遍历输出
for(i=1;i<=n;i++)
{
k=first[i];//k是当前的边的编号,next[k]是上一条边的编号
while(k!=-1)
{
printf("%d %d %d\n",u[k],v[k],w[k]);
k=next[k];
}
}
return 0;
}
一点讲解:
- 首先要明白first[]和next[]的含义: first[]的下标代表点。next[]的下标代表边的编号。
- u[i],v[i],w[i],代表边节点。
- first[]存储当前点的最新的边,next[]存储的内容是当前点的上一条边。
- 遍历的时候能看出来,输出的结果类似于尾插法(这种方法也是模拟的尾插法)。
- 输出的时候:k是当前的边的编号,next[k]是上一条边的编号。
- 附上一个比较好的博客