1 #include <iostream>
2 #include <algorithm>
3 #include <math.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7 using namespace std;
8 const int MAXN=100;
9 struct Lis
10 {
11 int id;
12 int dis;
13 Lis * next;
14 };
15 struct Num
16 {
17 int src_dis;
18 Lis * head;
19 }num[MAXN];
20
21 int stage[10][100];
22 void init(int n,int k)//初始化数据;
23 {
24 int m;
25 memset(num,0,sizeof(num));
26 for (int i = 1; i <= n; ++i)
27 {
28 num[i].src_dis=10000;
29 num[i].head=(Lis *)malloc(sizeof(Lis));
30 num[i].head->next=NULL;
31 }
32 int d1,d2,distance;
33 Lis *p;
34 cout<<"输入边的长度:输入1 2 4 表示点1 与 2的边的长度为 4:首数字为0表示结束输入."<<endl;
35 while(1)
36 {
37 cin>>d1;
38 if(d1==0)break;
39 cin>>d2>>distance;
40
41 p=(Lis *)malloc(sizeof(Lis));
42 p->id=d2;p->dis=distance;
43 if(num[d1].head->next==NULL)
44 {
45 num[d1].head->next=p;
46 p->next=NULL;
47 }
48 else{
49 p->next=num[d1].head->next;
50 num[d1].head->next=p;
51 }
52
53 }
54 cout<<"输入阶段"<<endl;
55
56
57 memset(stage,-1,sizeof stage);//若为-1 则无数据了
58 num[1].src_dis=0;
59 for(int i=1;i<=k;i++)
60 {
61 cin>>stage[i][0]; //第i个阶段的[0]是存当前阶段的个数
62
63 for(int j=1;j<=stage[i][0];j++)
64 {
65 cin>>stage[i][j];
66 }
67 }
68
69
70
71
72 }
73
74 void deal(int n,int k)
75 {
76 int i,j;
77 int a,b,c;
78 num[stage[1][1]].src_dis=0;//第一阶段的数到自己的距离
79
80
81
82
83 for (i = 2; i <= k; ++i)
84 {
85 if(i==2)
86 {
87 a=stage[1][1];
88 Lis *p=num[a].head->next;
89 for (j = 1; j <= stage[i][0]; ++j)
90 {
91 //while(p.id==a)
92 b=p->id;c=p->dis;
93 num[b].src_dis=c;
94 p=p->next;
95
96 }
97 }
98 else
99 {
100 for(int k = 1;k<=stage[i-1][0];k++)
101 {
102 int tmp=stage[i-1][k];
103 cout<<"tmp="<<tmp<<endl;
104 a=tmp;
105 Lis *p=num[a].head->next;
106 for (j = 1; j <= stage[i][0]; ++j)
107 {
108
109 b=p->id;c=p->dis+num[a].src_dis;//b为当前的点
110 //判断下第b个点的最短到达的数
111
112 num[b].src_dis=min(c,num[b].src_dis);
113 p=p->next;
114 if(!p)break;
115 }
116
117 }
118
119
120 // for(int x=1;x<=n;x++)
121 // {
122 // cout<<"stage "<<x<<" "<<num[x].src_dis<<" ";
123 // }
124 // cout<<endl<<endl;
125
126
127
128 }
129
130
131
132
133 }
134 int las = stage[k][1];
135 //cout<<"world"<<endl;
136 cout<<"dis = "<<num[las].src_dis<<endl;
137 }
138 int main()
139 {
140 int n,k;
141 cout<<"输入数据个数,和阶段数:";
142 cin>>n>>k;
143 init(n,k);
144
145 deal(n,k);
146
147
148
149
150
151 return 0;
152 }
153
154
155 /*
156
157 12
158 5
159 1 2 9
160 1 3 7
161 1 4 3
162 1 5 2
163 2 6 4
164 2 7 2
165 2 8 1
166 3 6 2
167 3 7 7
168 4 8 11
169 5 7 11
170 5 8 8
171 6 9 6
172 6 10 5
173 7 9 4
174 7 10 3
175 8 10 5
176 8 11 6
177 9 12 4
178 10 12 2
179 11 12 5
180 0
181 1
182 1
183 4
184 2 3 4 5
185 3
186 6 7 8
187 3
188 9 10 11
189 1
190 12
191
192
193 4 3
194 1 2 3
195 1 3 4
196 2 4 5
197 3 4 6
198 0
199
200
201 */