1 #include<iostream>
2 using namespace std;
3 #include<queue>
4 #define MAXN 10
5 #define INF 100000000
6 struct node
7 {
8 int to;
9 int w;
10 node * next;
11 };
12
13 node * List[MAXN];
14 int path[MAXN];
15 int dist[MAXN];
16 int vis[MAXN];
17 int n;
18
19 void SPFA(int v0)
20 {
21 int u;
22 for(int i=0;i<n;i++)
23 {
24 dist[i]=INF;
25 path[i]=v0;
26 vis[i]=0;
27 }
28 dist[v0]=0;
29 path[v0]=v0;
30 vis[v0]=1;
31 node *temp;
32 queue<int> q;
33 q.push(v0);
34
35 while(!q.empty())
36 {
37 u=q.front();
38 q.pop();
39 temp=List[u];
40 while(temp!=NULL)
41 {
42 int v=temp->to;
43 if(dist[v]>dist[u]+temp->w)
44 {
45 dist[v]=dist[u]+temp->w;
46 path[v]=u;
47 if(!vis[v])
48 {
49 q.push(v);
50 vis[v]++;
51 }
52 }
53 temp=temp->next;
54 }
55 }
56 }
57 void show(int i)
58 {
59 if(i==0)
60 return;
61 show(path[i]);
62 printf("%d->",i);
63 }
64 int main()
65 {
66 scanf("%d",&n);
67 int u,v,w;
68 node* temp;
69 memset(List ,0,sizeof(List));
70 while(1)
71 {
72 temp=new node;
73 scanf("%d%d%d",&u,&v,&w);
74 if(u==-1&&v==-1&&w==-1)
75 break;
76 temp->next=NULL;
77 temp->to=v;
78 temp->w=w;
79 if(List[u]==NULL) List[u]=temp;
80 else
81 {
82 temp->next=List[u];
83 List[u]=temp;
84 }
85 }
86 SPFA(0);
87 for(int i=1;i<n;i++)
88 {
89 printf("%d: ",dist[i]);
90 printf("%d->",0);
91 show(path[i]);
92 printf("%d\n",i);
93 }
94 system("pause");
95 return 0;
96 }
97
98 /*
99
100 7
101 0 1 6
102 0 2 5
103 0 3 5
104 1 4 -1
105 2 1 -2
106 2 4 1
107 3 2 -2
108 3 5 -1
109 4 6 3
110 5 6 3
111 -1 -1 -1
112 */