hdu4109

来源:互联网 发布:电脑软件维修基础教程 编辑:程序博客网 时间:2024/05/16 13:41

链接:点击打开链接

链接:给出N和M代表编号0~N-1个任务,和M条关系,每条关系由三个字母组成分别为X,Y,Z代表想要完成Y必须先完成X并花费Z个时间,电脑可以同时完成多个任务处理一次花费以单位时间,问完成0~N-1个任务需要多少时间,具体看样例,样例意思是先完成0,1,3然后完成2,4共花费2个单位时间

代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <stdlib.h>#include <vector>#include <queue>using namespace std;vector<int>v[1005];int n,m,maxx;int sum[1005],prefix[1005],w[1005][1005];void toposort(){    queue<int>q;    int i,j,u;    for(i=0;i<n;i++)    if(!prefix[i]){    sum[i]=1;                                                       //prefix数组值为0的sum值置为1    q.push(i);    }    while(q.size()){        u=q.front();q.pop();        for(i=0;i<v[u].size();i++){            prefix[v[u][i]]--;            sum[v[u][i]]=max(sum[v[u][i]],sum[u]+w[u][v[u][i]]);    //因为可能一个任务有几种方式可以选择,因此用到了dp的思想            if(prefix[v[u][i]]==0)                                  //这个任务全成的顺序是所有与其他任务没有关系的任务            q.push(v[u][i]);                                        //和确定关系的首任务也就是prefix数组值为0的任务先一        }                                                           //起完成,然后加上最长有关系的最长时间,因为完成最后    }                                                               //一个任务时的时间才是最终时间,所以找的是最大值}int main(){    int i,j,a,b,c;    while(scanf("%d%d",&n,&m)!=EOF){        for(i=0;i<=n;i++){            v[i].clear();            prefix[i]=0;            sum[i]=0;        }        for(i=0;i<m;i++){            scanf("%d%d%d",&a,&b,&c);            v[a].push_back(b);                                       //STL建图            prefix[b]++;            w[a][b]=c;                                               //用二维数组表示时间关系        }        maxx=-1;        toposort();        for(i=0;i<n;i++)                                             //找出最大时间        maxx=max(maxx,sum[i]);        printf("%d\n",maxx);    }    return 0;}/*给一组数据5 21 4 52 4 3*/

0 0
原创粉丝点击