中国大学MOOC-数据结构基础习题集、06-4、How Long Does It Take

题目链接:http://www.patest.cn/contests/mooc-ds/06-4

题目分析:这是一道考察图的拓扑排序问题,输入是图的相关信息,输出最早结束时间或者Impossible。题目还是比较简单的。

特别说明:

  1. 输出最大值,可以用标准库的函数:max_element,返回值是地址,所以需要*把内容取出来。如数组a[n],最大值为:*max_element(earlist, earlist+n)。当然不是求数组的最大值,而是求vector的最大值,只需要传相应的迭代器就可以。

  2. 同理,两者之中想求得最大值,可以直接max(a, b)返回的就是最大值了,当然注意不同类型的不能比较哦(除非重载过<)。

  3. 如果case2错误的话,注意earlist最大的,不一定是最后一个,要输出max_element(earlist, earlist+n),而不是earlist[n-1]。

  4. 如果case4错误的话,关注一下本代码64行,看看是不是忘记用max函数了(或者其他等价的函数)。

64   earlist[W] = max(earlist[W], earlist[V] + vec[i].l); 

代码分析:

  头文件及结构体声明:1~15

  cmp函数(用于sort排序函数的子函数)16~20

  最早完成时间、入度数组的动态申请及初始化:21~33

  每个活动的s,e,l的输入处理:34~43

  sort函数用于排序,把终点相同的活动集中在一起:44

  拓扑排序:45~71

  判断是否存在回路并输出结果:72~81

  

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 #include <queue>
 5 
 6 using namespace std;
 7 
 8 struct node
 9 {
10     int s;
11     int e;
12     int l;
13     node(int a, int b, int c):s(a), e(b), l(c) {}
14 };
15 
16 int cmp(const node &a, const node &b)
17 {
18     return a.e < b.e;
19 }
20 
21 int main()
22 {
23     int n, m;
24     cin >> n >> m;
25     int *earlist = new int[n];
26     int *Indegree = new int[n];
27 
28     for(int i=0; i<n; i++)
29     {
30         Indegree[i] = 0;
31         earlist[i] = 0;
32     }
33 
34     vector<node> vec;
35 
36     for(int i=0; i<m; i++)
37     {
38         int a, b, c;
39         cin >> a >> b >> c;
40         Indegree[b] ++;
41         vec.push_back(node(a, b, c));
42     }
43 
44     sort(vec.begin(), vec.end(), cmp);
45 
46     queue<int> Q;
47 
48     for(int V=0; V<n; V++)
49         if ( Indegree[V] == 0)
50             Q.push(V);
51 
52     int cnt = 0;
53 
54     while( Q.size() != 0)
55     {
56         int V = Q.front();
57         Q.pop();
58         cnt++;
59         for ( int i=0; i<m; i++ )
60         {
61             if ( vec[i].s == V)
62             {
63                 int W = vec[i].e;
64                 earlist[W] = max(earlist[W], earlist[V] + vec[i].l);
65                 if ( --Indegree[W] == 0)
66                     Q.push(W);
67             }
68         }
69 
70     }
71 
72     if ( cnt != n )
73     {
74         cout << "Impossible" << endl;
75     }
76     else
77     {
78         cout << *max_element(earlist, earlist+n) << endl;
79     }
80     return 0;
81 }

AC成果:

原文地址:https://www.cnblogs.com/clevercong/p/4215162.html