zoukankan      html  css  js  c++  java
  • 拓扑排序(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 */
  • 相关阅读:
    poj3669 广搜
    检索所有课程都选修的的学生的学号与姓名
    UVA10160 Servicing Stations
    uva11205 The broken pedometer 子集生成
    poj1101 the game 广搜
    poj3009 Curling 2.0 深搜
    poj 1564 Sum It Up 搜索
    HDU 2268 How To Use The Car (数学题)
    codeforces 467C George and Job(简单dp,看了题解抄一遍)
    HDU 2267 How Many People Can Survive(广搜,简单)
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427485.html
Copyright © 2011-2022 走看看