P1113 杂务
这道题我爆0啦,有点dp的小味道,显然,一个工程的完成时间由最慢的人决定(可以同时进行),m[i]代表完成杂物i所需的最少时间,m[i]=maxm[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; forint i=1;i<=n;i++) { p=new node); int t; cin>>p->n; t=p->n; cin>>v[p->n]; cin>>x; whilex!=0) { in[p->n]+=1; ife[x]==NULL) e[x]=p; else { p->next=e[x]->next; e[x]->next=p; } cin>>x; p=new node); p->n=t; } } forint i=1;i<=n;i++) ifin[i]==0) { q.pushi); m[i]=v[i]; } while!q.empty)) { node *p; p=e[q.front)]; whilep!=NULL) { in[p->n]-=1; ifin[p->n]==0) { q.pushp->n); } m[p->n]=maxm[p->n],m[q.front)]+v[p->n]); p=p->next; } q.pop); } forint i=1;i<=n;i++) ans=maxans,m[i]); cout<<m[n]; return 0; }