1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 const int maxn=1100;
6 const int maxm=maxn*maxn/2;
7 int n,m;
8 int head[maxn],nxt[maxn],pnt[maxn],cost[maxn];
9 int e;//e代表这些数组中的下标,便于录入和寻找某值
10 void AddEdge(int u,int v,int c)
11 {
12 pnt[e]=v;//表示连接的点
13 cost[e]=c;//该边的权值
14 nxt[e]=head[u];//nxt的下标与pnt的下标相同,所以nxt存储着上一个被找出的与u连接的点的pnt下标,和上一个nxt的下标,当值为-1时,则没有了;
15 head[u]=e++;//head存储着当前刚刚录入的pnt和nxt的下标,即存储着与u连接的目前最后出现的点的下标
16 }
17 int main()
18 {
19 while(~scanf("%d%d",&n,&m))
20 {
21 e=0;
22 memset(head,-1,sizeof(head));
23 for(int i=0; i<m; i++)
24 {
25 int u,v,c;
26 scanf("%d%d%d",&u,&v,&c);
27 AddEdge(u,v,c);
28 }
29 for(int u=1; u<=n; u++)//从前往后输出
30 {
31 printf("%d:",u);
32 for(int i=head[u]; i!=-1; i=nxt[i])
33 printf("%d cost=%d",pnt[i],cost[i]);
34 puts("");
35 }
36 }
37 return 0;
38 }
39 /*
40 模拟数据
41 7 12
42 1 2 24
43 1 3 8
44 1 4 15
45 2 5 6
46 3 5 7
47 3 6 3
48 4 7 4
49 5 7 9
50 6 5 2
51 6 7 3
52 6 4 5
53 7 2 3
54 */