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
- hdu4109
- hdu4109拓扑
- HDU4109 Instrction Arrangement @Z
- hdu4109拓扑Instrction Arrangement
- hdu4109(拓扑排序,dp)
- HDU4109 Instrction Arrangement 拓扑排序 关键路径
- HDU4109——Instrction Arrangement(关键路径)
- HDU4109 Instrction Arrangement 拓扑排序求关键路径
- HDU4109 Instrction Arrangement【差分约束】【拓扑排序】
- java内存管理:垃圾回收机制
- iOS请求网络数据的方式
- 第八章 主机名称与主机地址
- 模态,非模态对话框
- 超级文件分割《合并》机(分割大文件)
- hdu4109
- 高精度之快速幂
- Jetty vs. Tomcat
- 算法竞赛入门经典:第六章 数据结构基础 6.11迷宫
- CentOS下使用yum安装配置和使用svn
- 黑马程序员--Java基础学习(数组)第四天
- 使用标准输入对话框
- 多态的理解
- ExecutorService与Executors例子的简单剖析