• 邻接表解决多段图问题


      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 */
  • 相关阅读:
    CCF CSP-J/S2020第二轮认证评级名单
    CSP-J/S2020第二轮提高组北京市获奖分析
    CCF CSP-J/S2020第二轮评级规则
    [ZZ]80% 的信息学竞赛生都不知道的 USACO!含金量极高
    初步估分体验
    【ZZ】近3年北京市科技特长生招生趋势分析,编程好的孩子有哪些优势?
    立冬--2020CSP-J 游记
    P1061 Jam的计数法
    P1476 休息中的小呆
    P1444 [USACO1.3]虫洞wormhole
  • 原文地址:https://www.cnblogs.com/sylvialucy/p/5132492.html
Copyright © 2020-2023  润新知