邻接表解决多段图问题

  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 */
原文地址:https://www.cnblogs.com/sylvialucy/p/5132492.html