洛谷原题:https://www.luogu.com.cn/problem/P1113
图论,我的思路是用vector[]存图,vector[i]表示序号为i的任务,vector[i][0]表示第i的任务所需的时间,vector[i][j](j从2开始)表示第i的任务的前驱任务
然后遍历vecotr[i][2~...]记录最大值前驱任务下标,最后用累加(sum[i]记录完成第i个任务所需的时间)
#include
#include
#include
#include
using namespace std;
int n,a,b,sum[10005];
vector<int>c[10005];
int main(){
cin>>n;
for(int i=0;i>a>>b;
c[a].push_back(b);
while(cin>>b&&b){
c[a].push_back(b);
}
}
sum[1]=c[1][0];
for(int i=2;i<=n;i++){
int ans=i-1;
for(int j=1;jsize()-1;j++)ans=max(ans,c[i][j]);
sum[i]=sum[ans]+c[i][0];
}
cout<return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 10010;
int f[N];
int time1[N];
vector<int> a[N];
int dfs(int x) {
if (f[x]) return f[x];//该节点已经遍历过了,减枝
for (int i = 0; i < a[x].size(); i++) {
f[x] = max(f[x], dfs(a[x][i])); //说有子集中最大的节点
}
f[x] += time1[x]; // 加上自己需要的时间
return f[x];
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x, y,z;
cin >> x >> y >> z;
time1[x] = y;
while(z != 0){
a[z].push_back(x);// 只有完成z 后才能完成 x 所以有z -> x的边
scanf("%d", &z);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, dfs(i));
}
cout << ans<<endl;
return 0;
}