HDU 1285 确定比赛名次(拓扑排序基础)

题目大意:

  题目是说,给你一个n个节点的有向无环图,然后,对于这个无环图,我们对他进行拓扑排序,使得拓扑排序中的序列按照字典序的方式输出.

解题思路:

  直接套用toposort()模板。。。

  先说说toposort()的含义:

  拓扑排序就是说,我们在一完成一项工程的时候,这个工程分为了很多的子工程,我们不可能每次都一下完成很多的工程,我们要按照一定事

务之间的内在联系来完成相应的工程,比如你要完成A工程,那么你必须先完成B工程,所以说B的优先级高于A。那么我们有建图。。

代码:

 1 # include<cstdio>

 2 # include<iostream>

 3 # include<fstream>

 4 # include<algorithm>

 5 # include<functional>

 6 # include<cstring>

 7 # include<string>

 8 # include<cstdlib>

 9 # include<iomanip>

10 # include<numeric>

11 # include<cctype>

12 # include<cmath>

13 # include<ctime>

14 # include<queue>

15 # include<stack>

16 # include<list>

17 # include<set>

18 # include<map>

19 

20 using namespace std;

21 

22 const double PI=4.0*atan(1.0);

23 

24 typedef long long LL;

25 typedef unsigned long long ULL;

26 

27 # define inf 999999999

28 # define MAX 521

29 

30 int edge[MAX][MAX];//邻接矩阵

31 int index[MAX];

32 int book[MAX];

33 int top;

34 int n,m;

35 

36 

37 void init()

38 {

39     memset(edge,0,sizeof(edge));

40     for ( int i = 1;i <= n;i++ )

41     {

42         index[i] = 0;

43         book[i] = 0;

44     }

45     for ( int i = 0;i < m;i++ )

46     {

47         int t1,t2;

48         scanf("%d %d",&t1,&t2);

49         if ( edge[t1][t2] == 0 )

50         {

51             edge[t1][t2] = 1;

52             index[t2]++;

53         }

54     }

55 }

56 

57 void toposort()

58 {

59     int step;

60     while ( top < n )

61     {

62         for ( int i = 1;i <= n;i++ )

63         {

64             if ( index[i]==0&&book[i]==0 )

65             {

66                 step = i;

67                 break;

68             }

69         }

70         book[step] = 1;

71         if ( top )

72             printf(" ");

73         printf("%d",step);

74 

75         top++;

76         for ( int j = 1;j <= n;j++ )

77         {

78             if ( edge[step][j]==1 )

79             {

80                 index[j]--;

81             }

82         }

83 

84     }

85     printf("\n");

86 }

87 

88 int main(void)

89 {

90     while ( scanf("%d %d",&n,&m)!=EOF )

91     {

92         init();

93         top = 0;

94         toposort();

95     }

96     

97     return 0;

98 }

 

你可能感兴趣的:(HDU)