关于邻接表的Sample代码
从月光大牛那抢来的代码 研究了一晚上 把注释都补上了 邻接表真是强大哈
1#include<iostream>//读入,并输出
2using namespace std;
3
4const long LMAX=2000;
5struct node
6{
7 int v;
8 int next;
9}s[LMAX];//边
10int p[LMAX];//点对应下标 值为边
11int Index,m,n,x,y;//m点数,n边数
12
13void init()
14{
15 memset(p,-1,sizeof(p));
16 Index=0;
17 for(int i=0;i<n;i++)
18 {
19 scanf("%d%d",&x,&y);
20 s[Index].next=p[x];//保存原先x所在边的序号
21 s[Index].v=y;//设置另一端的点 (x)----------->(y) p[x]=index
22 p[x]=Index++;// 更新并记录点x所在边序号为当前边 (index)
23 //上述操作将一个自该点出发而邻接的有向边链接成表
24 }
25}
26
27void print()
28{
29 for(int i=0;i<m;i++)
30 {
31 printf("%d:",i);
32 for(int j=p[i];j!=-1;j=s[j].next)
33 printf(" -> %d",s[j].v);
34 printf("\n");
35 }
36}
37
38int main()
39{
40 while(scanf("%d%d",&m,&n)!=EOF)
41 {
42 init();
43 print();
44 }
45 return 0;
46}
2using namespace std;
3
4const long LMAX=2000;
5struct node
6{
7 int v;
8 int next;
9}s[LMAX];//边
10int p[LMAX];//点对应下标 值为边
11int Index,m,n,x,y;//m点数,n边数
12
13void init()
14{
15 memset(p,-1,sizeof(p));
16 Index=0;
17 for(int i=0;i<n;i++)
18 {
19 scanf("%d%d",&x,&y);
20 s[Index].next=p[x];//保存原先x所在边的序号
21 s[Index].v=y;//设置另一端的点 (x)----------->(y) p[x]=index
22 p[x]=Index++;// 更新并记录点x所在边序号为当前边 (index)
23 //上述操作将一个自该点出发而邻接的有向边链接成表
24 }
25}
26
27void print()
28{
29 for(int i=0;i<m;i++)
30 {
31 printf("%d:",i);
32 for(int j=p[i];j!=-1;j=s[j].next)
33 printf(" -> %d",s[j].v);
34 printf("\n");
35 }
36}
37
38int main()
39{
40 while(scanf("%d%d",&m,&n)!=EOF)
41 {
42 init();
43 print();
44 }
45 return 0;
46}