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 }
永远热爱,永远向着光。

浙公网安备 33010602011771号