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 }