zoukankan      html  css  js  c++  java
  • 拓扑排序(Kahn实现)

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <stdbool.h>
      5 
      6 #define MaxVertexNodeNumSize 1000
      7 #define MaxVertexNodeNameSize 100
      8 
      9 struct VertexBodyNode
     10 {
     11     char VertexName[MaxVertexNodeNameSize];
     12     int ArcWeight;
     13     int VertexIndex;
     14     struct VertexBodyNode *Next;
     15 };
     16 
     17 struct VertexHeadNode
     18 {
     19     char VertexName[MaxVertexNodeNameSize];
     20     int VertexWeight;
     21     struct VertexBodyNode *Next;
     22 };
     23 
     24 struct _Graph
     25 {
     26     struct VertexHeadNode VertexHeadNodeList[MaxVertexNodeNumSize];
     27     int ArcNum,VertexNum;
     28 };
     29 
     30 typedef int ElementType;
     31 
     32 struct StackNode
     33 {
     34     ElementType Element;
     35     struct StackNode *Next;
     36 };
     37 
     38 int StackIsEmpty(struct StackNode *StackTop)
     39 {
     40     return (StackTop -> Next == NULL);
     41 }
     42 
     43 int StackPush(ElementType ToBePush,struct StackNode *StackTop)
     44 {
     45     struct StackNode *TmpCell;
     46 
     47     TmpCell = malloc(sizeof(struct StackNode));
     48     if(TmpCell == NULL)
     49     {
     50         return 1;
     51     }
     52     else
     53     {
     54         TmpCell -> Element = ToBePush;
     55         TmpCell -> Next = StackTop -> Next;
     56         StackTop -> Next = TmpCell;
     57     }
     58     return 0;
     59 }
     60 
     61 ElementType StackGetTop(struct StackNode *StackTop)
     62 {
     63     if(!StackIsEmpty(StackTop))
     64     {
     65         return StackTop -> Next -> Element;
     66     }
     67 }
     68 
     69 int StackPop(struct StackNode *StackTop)
     70 {
     71     struct StackNode *FirstCell;
     72 
     73     if(StackIsEmpty(StackTop))
     74     {
     75         return 1;
     76     }
     77     else
     78     {
     79         FirstCell = StackTop -> Next;
     80         StackTop -> Next = StackTop -> Next -> Next;
     81         free(FirstCell);
     82     }
     83     return 0;
     84 }
     85 
     86 int MakeStackEmpty(struct StackNode *StackTop)
     87 {
     88     if(StackTop == NULL)
     89     {
     90         return 1;
     91     }
     92     else
     93     {
     94         while( !StackIsEmpty(StackTop) )
     95         {
     96             StackPop(StackTop);
     97         }
     98     }
     99     return 0;
    100 }
    101 
    102 struct StackNode *StackInit()
    103 {
    104     struct StackNode *StackTop;
    105 
    106     StackTop = malloc(sizeof(struct StackNode));
    107     if(StackTop == NULL)
    108     {
    109         return NULL;
    110     }
    111 
    112     StackTop -> Next = NULL;
    113     MakeStackEmpty(StackTop);
    114     return StackTop;
    115 }
    116 
    117 int StackDelete(struct StackNode *StackTop)
    118 {
    119     if(StackTop == NULL)
    120     {
    121         return 1;
    122     }
    123     else
    124     {
    125         MakeStackEmpty(StackTop);
    126         free(StackTop);
    127     }
    128     return 0;
    129 }
    130 
    131 int VertexName2Index(struct _Graph *DirectedGraph,char *VName)
    132 {
    133     int i;
    134     for(i = 0; i < DirectedGraph -> VertexNum; i ++)
    135     {
    136         if(strcmp(DirectedGraph -> VertexHeadNodeList[i].VertexName,VName)==0)
    137         {
    138             return i;
    139         }
    140     }
    141     return -1;
    142 }
    143 
    144 void AddOneArc(struct _Graph *DirectedGraph,int ArcIndex_1,int ArcIndex_2,int AWeight)
    145 {
    146     struct VertexBodyNode *BNode = malloc(sizeof(struct VertexBodyNode));
    147 
    148     strcpy(BNode -> VertexName,DirectedGraph -> VertexHeadNodeList[ArcIndex_2].VertexName);
    149 
    150     BNode -> ArcWeight = AWeight;
    151     BNode -> VertexIndex = ArcIndex_2;
    152     BNode -> Next = NULL;
    153 
    154     struct VertexBodyNode *TmpPointer;
    155     TmpPointer = DirectedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
    156     while(TmpPointer != NULL && TmpPointer -> Next != NULL)
    157     {
    158         TmpPointer = TmpPointer -> Next;
    159     }
    160     if(TmpPointer==NULL)
    161     {
    162         DirectedGraph -> VertexHeadNodeList[ArcIndex_1].Next = BNode;
    163     }
    164     else
    165     {
    166         TmpPointer -> Next = BNode;
    167     }
    168 }
    169 
    170 struct _Graph *UGCreat(int ArcSum,int VertexSum)
    171 {
    172     int i,j;
    173     struct _Graph *DirectedGraph = malloc(sizeof(struct _Graph));
    174     DirectedGraph -> ArcNum = ArcSum;
    175     DirectedGraph -> VertexNum = VertexSum;
    176 
    177     for(i = 0; i < VertexSum; i ++)
    178     {
    179         scanf("%s %d",DirectedGraph -> VertexHeadNodeList[i].VertexName,&DirectedGraph -> VertexHeadNodeList[i].VertexWeight);
    180     }
    181 
    182     for(i = 0; i < VertexSum; i ++)
    183     {
    184         DirectedGraph -> VertexHeadNodeList[i].Next = NULL;
    185     }
    186 
    187     for(i = 0; i < ArcSum; i ++)
    188     {
    189         char Arc_1[MaxVertexNodeNameSize];
    190         char Arc_2[MaxVertexNodeNameSize];
    191         int ArcIndex_1;
    192         int ArcIndex_2;
    193         int ArcWeight;
    194 
    195         scanf("%s %s %d",Arc_1,Arc_2,&ArcWeight);
    196 
    197         ArcIndex_1 = VertexName2Index(DirectedGraph,Arc_1);
    198         ArcIndex_2 = VertexName2Index(DirectedGraph,Arc_2);
    199 
    200         AddOneArc(DirectedGraph,ArcIndex_1,ArcIndex_2,ArcWeight);
    201     }
    202     return DirectedGraph;
    203 }
    204 
    205 void Travel(struct _Graph *DirectedGraph)
    206 {
    207     char StartingPoint[MaxVertexNodeNameSize];
    208     char OverPoint[MaxVertexNodeNameSize];
    209 
    210     printf("Input start and over
    ");
    211     scanf("%s %s",StartingPoint,OverPoint);
    212 
    213     int StartIndex = VertexName2Index(DirectedGraph,StartingPoint);
    214     int OverIndex = VertexName2Index(DirectedGraph,OverPoint);
    215 
    216     struct VertexBodyNode *TmpPointer;
    217     TmpPointer = DirectedGraph -> VertexHeadNodeList[StartIndex].Next;
    218     while(TmpPointer != NULL)
    219     {
    220         if(OverIndex==TmpPointer -> VertexIndex)
    221         {
    222             printf("Distance:%d GetVertexPointSum:%d",TmpPointer->ArcWeight
    223                    ,DirectedGraph -> VertexHeadNodeList[StartIndex].VertexWeight+DirectedGraph -> VertexHeadNodeList[OverIndex].VertexWeight);
    224             break;
    225         }
    226         else
    227         {
    228             TmpPointer = TmpPointer -> Next;
    229         }
    230     }
    231 }
    232 
    233 bool KahnTopologicalSort(struct _Graph *DirectedGraph)
    234 {
    235     int InDgree[DirectedGraph->VertexNum];
    236     memset(InDgree,0,sizeof(InDgree));
    237 
    238 
    239     // count every vertex's indgree and store in array InDgree
    240     int i;
    241     struct VertexBodyNode *TmpPointer;
    242     for(i = 0; i < DirectedGraph->VertexNum; i ++)
    243     {
    244         TmpPointer = DirectedGraph->VertexHeadNodeList[i].Next;
    245         while(TmpPointer != NULL)
    246         {
    247             InDgree[TmpPointer->VertexIndex] ++;
    248             TmpPointer = TmpPointer -> Next;
    249         }
    250     }
    251     
    252     //put Vertex whose Indgree is zero into stack
    253     struct StackNode *StackTop;
    254     StackTop = StackInit();
    255     for(i = 0; i < DirectedGraph->VertexNum; i ++)
    256     {
    257         if(!InDgree[i])
    258         {
    259             StackPush(i,StackTop);
    260         }
    261     }
    262     
    263     int Index;
    264     while(!StackIsEmpty(StackTop))
    265     {
    266         Index = StackGetTop(StackTop);
    267         StackPop(StackTop);
    268         printf("%s ",DirectedGraph -> VertexHeadNodeList[Index].VertexName);
    269         
    270         TmpPointer = DirectedGraph->VertexHeadNodeList[Index].Next;
    271         while(TmpPointer != NULL)
    272         {
    273             InDgree[TmpPointer->VertexIndex] --;
    274             if(! InDgree[TmpPointer->VertexIndex])
    275             {
    276                 StackPush(TmpPointer->VertexIndex,StackTop);
    277             }
    278             TmpPointer = TmpPointer -> Next;
    279         }
    280     }
    281 }
    282 
    283 int main()
    284 {
    285     struct _Graph *G = UGCreat(8,5);
    286 
    287 //    Travel(G);
    288     KahnTopologicalSort(G);
    289     return 0;
    290 }
    291 
    292 /*
    293         beijing 18
    294         zhengzhou 10
    295         hefei 9
    296         nanjing 12
    297         guangzhou 14
    298         beijing zhengzhou 7
    299         beijing hefei 9
    300         beijing nanjing 8
    301         zhengzhou hefei 5
    302         hefei nanjing 3
    303         zhengzhou guangzhou 7
    304         hefei guangzhou 8
    305         nanjing guangzhou 6
    306         
    307 */
  • 相关阅读:
    uva 10491 Cows and Cars
    uva 10910 Marks Distribution
    uva 11029 Leading and Trailing
    手算整数的平方根
    uva 10375 Choose and divide
    uva 10056 What is the Probability?
    uva 11027 Palindromic Permutation
    uva 10023 Square root
    Ural(Timus) 1081. Binary Lexicographic Sequence
    扩展欧几里得(求解线性方程)
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427491.html
Copyright © 2011-2022 走看看