静态邻接表

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 const long lmax=10; //边的数量
 5 const long mmax=10; //点的数量
 6 struct node //静态邻接表用每个node表示每一条边
 7 {
 8       int v; //边的终点
 9       int w; //边的权值
10       int next; //同一起点的上一条边的在edge数组的位置
11 
12 }edge[lmax];
13 int pre[mmax]; //用来记录以X为起点的最终一条边在edge数组的位置
14 int n,m; //n用来记录点的个数,m用来记录边的条数
15 void input()
16 { 
17     memset(pre,-1,sizeof(pre));
18     int x,y,w;
19     int index=1; //index用来记录边的数量
20     int q;
21 for(q=1;q<=m;q++)
22 {
23     scanf("%d%d%d",&x,&y,&w);
24 
25     edge[index].v=y;
26     edge[index].w=w;
27     edge[index].next=pre[x]; //应用的是倒向追踪法,保存起以x为起点的上一条边在edge数组中的位置
28     pre[x]=index++; //index用来记录edge中的位置,位置不断更新
29 
30 }
31 }
32 //等input结束,pre数组里面存的是以x为起点,最后一条边在edge中的位置
33 void output()
34 {
35     int j;
36 for(j=1;j<=n;j++)
37 {
38      printf("以%d为起点\n",j);
39 for(int k=pre[j];k!=-1;k=edge[k].next) //采用倒向追踪法,对j为起点的进行倒向追踪
40 {
41      printf("%d->",edge[k].v);
42   }
43      printf("%d\n",j);
44  }
45 }
46 int main()
47 {
48 while(scanf("%d%d",&n,&m)!=EOF&&(n!=0&&m!=0))
49 {
50    input();
51     output();
52 }
53 return 0;
54 } 
原文地址:https://www.cnblogs.com/zafuacm/p/2877170.html