pojTest for Job(记忆化搜索)

此题可用前向星建图,可优化时间,但我不会。。。

注意:用cin cout会超时。。。

ac代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<cmath>
 6 #define ll long long
 7 #define inf 0x3f3f3f3f
 8 using namespace std;
 9 const int N = 100000 + 10;
10 
11 vector<int>vec[N];
12 int prof[N], vis[N], in[N];
13 int maxn = -inf;
14 int dp[N];
15 
16 int dfs(int u) {
17 
18     vis[u] = 1;
19     int len = vec[u].size();
20     if (len == 0) {
21         return prof[u];
22     }
23     for (int i = 0; i < len; i++) {
24         int son = vec[u][i];
25         if (!vis[son]) {
26             dp[son] = dfs(vec[u][i]);
27         }
28         dp[u] = max(dp[u], dp[son] + prof[u]);
29     }
30     return dp[u];
31 
32 }
33 
34 int main() {
35     
36     //ios::sync_with_stdio(0);
37     int n, m;
38     while (~scanf("%d %d", &n, &m)) {
39         memset(dp, -0x3f, sizeof(dp));
40         memset(vis, 0, sizeof(vis));
41         memset(in, 0, sizeof(in));
42         for (int i = 1; i <= n; i++) {
43             vec[i].clear();
44         }
45         maxn = -inf;
46         for (int i = 1; i <= n; i++) {
47             scanf("%d", &prof[i]);
48         }
49         for (int i = 1; i <= m; i++) {
50             int u, v;
51             scanf("%d %d", &u, &v);
52             in[v] = 1;
53             vec[u].push_back(v);
54         }
55         for (int i = 1; i <= n; i++) {
56             if (!in[i]) {
57                 maxn = max(maxn, dfs(i));
58             }
59         }
60         printf("%d\n", maxn);
61     }
62     return 0;
63 }

 

 
posted @ 2022-03-25 15:54  Keyzee  阅读(91)  评论(0)    收藏  举报