P1113 杂务(拓扑排序)

https://www.luogu.com.cn/problem/P1113

给一些工作的消耗时间,和完成这些工作必须的准备工作。求完成的最少时间。

把数据建模,转化为dag,拓扑排序完事。(循环次数还是用for循环吧,用while把n减成0,debug了好久,哭了)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
vector<int>v[maxn];
int cost[maxn];
int indge[maxn];
int dp[maxn];
int n,a,b,c,d;
queue<int>q;
void topsort()
{
    while(!q.empty())q.pop();
    for(int i=1;i<=n;i++){
        if(indge[i]==0){
            q.push(i);
            dp[i]=cost[i];
        }
    }
    while(!q.empty()){
        int k=q.front();
        q.pop();
        for(int i=0;i<v[k].size();i++){
            if(--indge[v[k][i]]==0)q.push(v[k][i]);
            dp[v[k][i]]=max(dp[k]+cost[v[k][i]],dp[v[k][i]]);
        }
    }
}
int main()
{
    cin>>n;
    fill(dp,dp+maxn,0);
    fill(cost,cost+maxn,0);
    fill(indge,indge+maxn,0);
    for(int o=1;o<=n;o++){
        cin>>a>>b;
        cost[a]=b;
        cin>>c;
        while(c!=0){
            v[c].push_back(a);
            cin>>c;
            indge[a]++;
        }
    }
    topsort();int maxx=-1;
    for(int i=1;i<=n;i++){
         maxx=max(dp[i],maxx);
    }
    cout<<maxx<<endl;
    return 0;
}

 

posted @ 2020-05-19 14:46  mohari  阅读(172)  评论(0编辑  收藏  举报