poj1949Chores(建图或者dp)
生活随笔
收集整理的這篇文章主要介紹了
poj1949Chores(建图或者dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /*
2 題意:n個任務,有某些任務要在一些任務之前完成才能開始做!
3 第k個任務的約束只能是1...k-1個任務!問最終需要最少的時間完成全部的
4 任務!
5 思路:第i個任務要在第j個任務之前做,就在i,j之間建立一條有向邊!
6 如果第i個任務之前沒有任務,那么就是0和i建立一條有向邊!
7 最后求一條0到所有節點距離的最大值!不一定是最后一個任務完成的
8 時間是最長的時間.......
9 */
10 #include<iostream>
11 #include<cstring>
12 #include<cstdio>
13 #include<algorithm>
14 #include<vector>
15 #include<queue>
16 #define N 10005
17 using namespace std;
18
19 struct Edge{
20 int v, w;
21 Edge(){}
22
23 Edge(int v, int w){
24 this->v=v;
25 this->w=w;
26 }
27 };
28
29 queue<int>q;
30 vector<Edge>g[N];
31 int d[N];
32 int vis[N];
33 int maxT;
34 void spfa(){
35 q.push(0);
36 vis[0]=1;
37 while(!q.empty()){
38 int u=q.front();
39 q.pop();
40 vis[u]=0;
41 int len=g[u].size();
42 for(int i=0; i<len; ++i){
43 int v=g[u][i].v, w=g[u][i].w;
44 if(d[v]<d[u]+w){
45 d[v]=d[u]+w;
46 if(maxT<d[v]) maxT=d[v];
47 if(!vis[v]){
48 q.push(v);
49 vis[v]=1;
50 }
51 }
52 }
53 }
54 }
55 int main(){
56 int n;
57 scanf("%d", &n);
58 for(int i=1; i<=n; ++i){
59 d[i]=vis[i]=0;
60 int tt, m;
61 scanf("%d%d", &tt, &m);
62 if(m==0) g[0].push_back(Edge(i, tt));
63 while(m--){
64 int v;
65 scanf("%d", &v);
66 g[v].push_back(Edge(i, tt));
67 }
68 }
69 maxT=0;
70 spfa();
71 printf("%d\n", maxT);
72 return 0;
73 } 1 /*
2 思路:其實是一個簡單的dp題目!
3 */
4 #include<iostream>
5 #include<cstring>
6 #include<cstdio>
7 #include<algorithm>
8 #define N 10005
9 using namespace std;
10 int dp[N];
11 int main(){
12
13 int n, maxT=0;
14 scanf("%d", &n);
15 for(int i=1; i<=n; ++i){
16 int w, m;
17 scanf("%d%d", &w, &m);
18 if(m==0) dp[i]=w;//不僅僅只有1節點沒有約束節點
19
20 while(m--){
21 int v;
22 scanf("%d", &v);
23 dp[i]=max(dp[i], dp[v]+w);
24 }
25 if(maxT<dp[i]) maxT=dp[i];
26 }
27 printf("%d\n", maxT);
28 return 0;
29 }
?
轉載于:https://www.cnblogs.com/hujunzheng/p/3958867.html
總結
以上是生活随笔為你收集整理的poj1949Chores(建图或者dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js学习内容的整理
- 下一篇: 中缀试转后缀试及前缀试并计算其结果