题意

一共有n门课,每门课有a[i]个阶段,一开始每门课都在第0个阶段,我们需要到达所有课的最高的阶段,现在有m个培训班,每个培训班需要c[i]课程满足所在阶段大于等于l1,那么就可以到达d课程l2的阶段,每个培训班有相应的费用,求所有课程到达最高阶段的费用最小值。

题解

我们建立如下有向图。
1. 将每门课程的第0阶段与超级起点连接,费用为0。
2. 将每门课第i个阶段连接到第i-1个阶段,费用为0。
3. 连接题中所给的培训连接,费用为w[i]
然后从超级起点开始跑朱刘算法。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
int vis[605],idx[605],pre[605],in[605],cnt;
struct node{int u,v;int w;
}edge[20005];
int solve(int t,int n,int m){int x,y,i,j;int ans=0;while(1){for(i=1;i<=n;i++)in[i]=inf;for(i=1;i<=m;i++){node e=edge[i];if(e.u!=e.v&&e.w<in[e.v]){in[e.v]=e.w;pre[e.v]=e.u;}}for(i=1;i<=n;i++){if(in[i]==inf&&i!=t)return -1;if(i!=t)ans+=in[i];}int tot=0;memset(vis,-1,sizeof(vis));memset(idx,-1,sizeof(idx));for(i=1;i<=n;i++){y=i;while(vis[y]!=i&&idx[y]==-1&&y!=t){vis[y]=i;y=pre[y];}if(y!=t&&idx[y]==-1){tot++;idx[y]=tot;for(x=pre[y];x!=y;x=pre[x])idx[x]=tot;}}if(!tot)break;for(i=1;i<=n;i++)if(idx[i]==-1)idx[i]=++tot;for(i=1;i<=m;i++){int y=edge[i].v;edge[i].u=idx[edge[i].u];edge[i].v=idx[edge[i].v];if(edge[i].u!=edge[i].v)edge[i].w-=in[y];}n=tot;t=idx[t];}return ans;
}
int a[55],num[55][505],all;
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){if(n==0&&m==0)break;cnt=0,all=1;for(int i=1;i<=n;i++)   {scanf("%d",&a[i]);num[i][0]=all++;for(int j=1;j<=a[i];j++){num[i][j]=all++;edge[++cnt].u=num[i][j];edge[cnt].v=num[i][j-1];edge[cnt].w=0;}}for(int i=1;i<=n;i++){edge[++cnt].u=all;edge[cnt].v=num[i][0];edge[cnt].w=0;}for(int i=1;i<=m;i++){int c,l1,d,l2,w;scanf("%d%d%d%d%d",&c,&l1,&d,&l2,&w);edge[++cnt].u=num[c][l1];edge[cnt].v=num[d][l2];edge[cnt].w=w;}int ans=solve(all,all,cnt);printf("%d\n",ans);}return 0;
}

HDU 4966 GGS-DDU [最小树形图]相关推荐

  1. HDU 4966 GGS-DDU(最小树形图)

    n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...

  2. GGS-DDU 【HDU - 4966】【最小树形图】

    题目链接 最小树形图讲解 一道最小树形图的裸题,我们只需要对于在同一学科的由高等级逐一指向低等级的边建为0权值即可,另外的边,建立成有向边即可. #include <iostream> # ...

  3. HDU 4966 - GGS-DDU (最小树形图)

    多校综合排名前25名的学校请发送邮件到HDUACM@QQ.COM,告知转账信息(支付宝或者卡号)  GGS-DDU Time Limit: 2000/1000 MS (Java/Others)     ...

  4. HDU - 4966 GGS-DDU (最小树形图)

    题目大意:有一个人,想学习N个科目,每个科目都有相应的层次 有M个课程,M个课程的要求是,你的第c个科目的层次要达到l1,才可以参加,参加完这个课程后,你需要缴费money,但你的第d个科目的层次会达 ...

  5. hdu 2121 最小树形图 +虚根

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意: n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍 ...

  6. HDU 4009 Transfer water (最小树形图+虚根)

    题意:有一个村庄需要修建供水系统.每户居民的房子都有一个三维坐标,每户居民可以选择自己挖井或者从其他居民家里引水.挖水井和引水分别需要花费不同的钱.每户居民有一个意愿表,只愿意对表内的居民家供水.最后 ...

  7. HDU 2121 Ice_cream’s world II (最小树形图+虚根)

    题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible. 题解:最小树形图+虚根 还好做了这题,板子有点问题 ...

  8. hdu 4009 Transfer water(最小树形图模板)

    题目链接:点击打开链接 Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Ja ...

  9. hdu-4966 GGS-DDU 最小树形图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4966 题意: 给你n门课的最高等级及m条升级方法,开始时你每门课的等级都在等级0,升级方法的5个参数代 ...

  10. HDU 4966:GGS-DDU

    HDU:GGS-DDU 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4966 题目大意:有$n$个课程,初始都在等级$0$,每个课程需要达到等级$a[ ...

最新文章

  1. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?
  2. linux 进程 内存布局 初探
  3. Java中封装的全局日期处理工具类
  4. Java窗口(JFrame)从零开始(8)——文本框+文本域+密码框
  5. android表格布局的使用方法,Android布局(RelativeLayout、TableLayout等)使用方法
  6. 装箱问题(信息学奥赛一本通-T1226)
  7. 安全性配置-定义任务流节点
  8. Jupyter更改主题和字体及远程访问
  9. OSX/Linux 配置SSH免密登录并配置(Alias)别名登录
  10. 【人脸识别】基于matlab GUI BP神经网络人脸识别(含识别率)【含Matlab源码 891期】
  11. Linux下挂载NTFS
  12. MTK功能机RF射频参数计算与配置
  13. iOS 加速计 摇一摇
  14. C语言数组排序——选择排序
  15. 我国的离婚率现状,通过数据的可视化展示,来直观的展现给大家
  16. linux 光功率 模块_光模块基本参数-消光比/光功率/灵敏度
  17. java中modifier_Java Modifier工具类
  18. PCB原理图绘制(种草立创eda)
  19. 思迅软锁安装配置说明
  20. C# 使用ToolTip控件实现气泡消息提示

热门文章

  1. 【diannaoxitong】word打不开或发送错误解决办法
  2. 云计算以及虚拟化的简单介绍
  3. 服务器端查看图片库 eog
  4. Gmail中基本html
  5. Scala入门系列(十二):隐式转换
  6. 方正飞鸿智能信息平台(FIX ES2007)帮助手册+知识库
  7. Seaborn实战案例 | 绘制分类条形统计图
  8. MATLAB程序系列1_混沌理论
  9. SPL lookup
  10. 赛锐信息:5个方面帮您应对 SAP License 审计