P1113 杂务
这道题我爆0啦,有点dp的小味道,显然,一个工程的完成时间由最慢的人决定(可以同时进行),m[i]代表完成杂物i所需的最少时间,m[i]=max(m[i],m[j]+v[i]),j是需要在i之前完成的杂物,最慢的也要完成,所以要取最大。虽然题目中说准备工作只可能在杂务1..k-1中,但这并不代表着在完成n之前,需要把1~n-1都要完成,所以要扫一遍。
#include<bits/stdc++.h> using namespace std; queue<int>q; int n; int in[100010]; bool b[100010]; int v[100010]; int m[100010]; int ans; struct node { int n; node *next; }*e[100010]; int main() { cin>>n; node *p; int x; for(int i=1;i<=n;i++) { p=new node(); int t; cin>>p->n; t=p->n; cin>>v[p->n]; cin>>x; while(x!=0) { in[p->n]+=1; if(e[x]==NULL) e[x]=p; else { p->next=e[x]->next; e[x]->next=p; } cin>>x; p=new node(); p->n=t; } } for(int i=1;i<=n;i++) if(in[i]==0) { q.push(i); m[i]=v[i]; } while(!q.empty()) { node *p; p=e[q.front()]; while(p!=NULL) { in[p->n]-=1; if(in[p->n]==0) { q.push(p->n); } m[p->n]=max(m[p->n],m[q.front()]+v[p->n]); p=p->next; } q.pop(); } for(int i=1;i<=n;i++) ans=max(ans,m[i]); cout<<m[n]; return 0; }