• 拓扑排序(DFS实现)


      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 int VertexName2Index(struct _Graph *DirectedGraph,char *VName)
     31 {
     32     int i;
     33     for(i = 0; i < DirectedGraph -> VertexNum; i ++)
     34     {
     35         if(strcmp(DirectedGraph -> VertexHeadNodeList[i].VertexName,VName)==0)
     36         {
     37             return i;
     38         }
     39     }
     40     return -1;
     41 }
     42 
     43 void AddOneArc(struct _Graph *DirectedGraph,int ArcIndex_1,int ArcIndex_2,int AWeight)
     44 {
     45     struct VertexBodyNode *BNode = malloc(sizeof(struct VertexBodyNode));
     46 
     47     strcpy(BNode -> VertexName,DirectedGraph -> VertexHeadNodeList[ArcIndex_2].VertexName);
     48 
     49     BNode -> ArcWeight = AWeight;
     50     BNode -> VertexIndex = ArcIndex_2;
     51     BNode -> Next = NULL;
     52 
     53     struct VertexBodyNode *TmpPointer;
     54     TmpPointer = DirectedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
     55     while(TmpPointer != NULL && TmpPointer -> Next != NULL)
     56     {
     57         TmpPointer = TmpPointer -> Next;
     58     }
     59     if(TmpPointer==NULL)
     60     {
     61         DirectedGraph -> VertexHeadNodeList[ArcIndex_1].Next = BNode;
     62     }
     63     else
     64     {
     65         TmpPointer -> Next = BNode;
     66     }
     67 }
     68 
     69 struct _Graph *UGCreat(int ArcSum,int VertexSum)
     70 {
     71     int i,j;
     72     struct _Graph *DirectedGraph = malloc(sizeof(struct _Graph));
     73     DirectedGraph -> ArcNum = ArcSum;
     74     DirectedGraph -> VertexNum = VertexSum;
     75 
     76     for(i = 0; i < VertexSum; i ++)
     77     {
     78         scanf("%s %d",DirectedGraph -> VertexHeadNodeList[i].VertexName,&DirectedGraph -> VertexHeadNodeList[i].VertexWeight);
     79     }
     80 
     81     for(i = 0; i < VertexSum; i ++)
     82     {
     83         DirectedGraph -> VertexHeadNodeList[i].Next = NULL;
     84     }
     85 
     86     for(i = 0; i < ArcSum; i ++)
     87     {
     88         char Arc_1[MaxVertexNodeNameSize];
     89         char Arc_2[MaxVertexNodeNameSize];
     90         int ArcIndex_1;
     91         int ArcIndex_2;
     92         int ArcWeight;
     93 
     94         scanf("%s %s %d",Arc_1,Arc_2,&ArcWeight);
     95 
     96         ArcIndex_1 = VertexName2Index(DirectedGraph,Arc_1);
     97         ArcIndex_2 = VertexName2Index(DirectedGraph,Arc_2);
     98 
     99         AddOneArc(DirectedGraph,ArcIndex_1,ArcIndex_2,ArcWeight);
    100     }
    101     return DirectedGraph;
    102 }
    103 
    104 void Travel(struct _Graph *DirectedGraph)
    105 {
    106     char StartingPoint[MaxVertexNodeNameSize];
    107     char OverPoint[MaxVertexNodeNameSize];
    108 
    109     printf("Input start and over
    ");
    110     scanf("%s %s",StartingPoint,OverPoint);
    111 
    112     int StartIndex = VertexName2Index(DirectedGraph,StartingPoint);
    113     int OverIndex = VertexName2Index(DirectedGraph,OverPoint);
    114 
    115     struct VertexBodyNode *TmpPointer;
    116     TmpPointer = DirectedGraph -> VertexHeadNodeList[StartIndex].Next;
    117     while(TmpPointer != NULL)
    118     {
    119         if(OverIndex==TmpPointer -> VertexIndex)
    120         {
    121             printf("Distance:%d GetVertexPointSum:%d",TmpPointer->ArcWeight
    122                    ,DirectedGraph -> VertexHeadNodeList[StartIndex].VertexWeight+DirectedGraph -> VertexHeadNodeList[OverIndex].VertexWeight);
    123             break;
    124         }
    125         else
    126         {
    127             TmpPointer = TmpPointer -> Next;
    128         }
    129     }
    130 }
    131 
    132 void _DFSTSort(struct _Graph *DirectedGraph,int i,bool Visit[],int Output[],int *OutputEnd)
    133 {
    134     Visit[i] = true;
    135 
    136     struct VertexBodyNode *TmpPointer = DirectedGraph->VertexHeadNodeList[i].Next;
    137     while(TmpPointer != NULL)
    138     {
    139         if(! Visit[TmpPointer->VertexIndex])
    140         {
    141             _DFSTSort(DirectedGraph,TmpPointer->VertexIndex,Visit,Output,OutputEnd);
    142         }
    143         TmpPointer = TmpPointer -> Next;
    144     }
    145     Output[*OutputEnd] = i;
    146     *OutputEnd += 1;
    147 }
    148 
    149 bool DFSTopologicalSort(struct _Graph *DirectedGraph)
    150 {
    151     bool Visit[DirectedGraph->VertexNum];
    152     int Output[DirectedGraph->VertexNum];
    153     int OutputEnd = 0;
    154     memset(Visit,0,sizeof(Visit));
    155 
    156     int i;
    157     for(i = 0; i < DirectedGraph->VertexNum; i ++)
    158     {
    159         if(! Visit[i])
    160         {
    161             _DFSTSort(DirectedGraph,i,Visit,Output,&OutputEnd);
    162         }
    163     }
    164 
    165     for(i = OutputEnd-1; i >= 0; i --)
    166     {
    167         printf("%s ",DirectedGraph -> VertexHeadNodeList[Output[i]].VertexName);
    168     }
    169 }
    170 
    171 int main()
    172 {
    173     struct _Graph *G = UGCreat(8,5);
    174 
    175 //    Travel(G);
    176     DFSTopologicalSort(G);
    177     return 0;
    178 }
    179 
    180 /*
    181         beijing 18
    182         zhengzhou 10
    183         hefei 9
    184         nanjing 12
    185         guangzhou 14
    186         beijing zhengzhou 7
    187         beijing hefei 9
    188         beijing nanjing 8
    189         zhengzhou hefei 5
    190         hefei nanjing 3
    191         zhengzhou guangzhou 7
    192         hefei guangzhou 8
    193         nanjing guangzhou 6
    194 */
  • 相关阅读:
    mysql触发器:插入数据前更新创建时间为服务器的时间
    import Vue form 'vue’的意思
    【LOJ#10172】涂抹果酱
    【LOJ#10171】牧场的安排
    【LOJ#10170】国王
    【POJ2411】Mondriaan's Dream
    【POJ2228】Naptime
    【CTSC1997】选课
    【CH5302】金字塔
    【洛谷P1168】中位数
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427485.html
Copyright © 2020-2023  润新知