题意:
      以一些科目,和辅导班,每个科目最终要求修到某个等级,可以花一定的钱在辅导班把某一科目修到某一等级,进入辅导班的时候会有一个限制,那就是达到他给出的科目和等级限制,比如a b c d m的意思就是科目a必须达到b等级才可以花m钱把科目c修到d等级,最后问把所有科目修到给定的等级要花的最小辅导费用。

思路:

      我们可以把每一个科目的每一个等级看成一个点,然后根据给定的关系,把等级和等级之间的边和权建立起来,然后再把非0等级建一条当前等级-1的边,费用为0,意思是修了当前等级,之前的等级也算是修完了,最后在虚拟出来一个点,连接所有等级0的点,意思是最开始0等级的已经修完了,然后一遍最小树形图就行了,对于最小树形图,他其实就是在求有向图的最小生成树,用的是 朱-刘 算法(我自己现在还不了解那个算法,只是直接粘模板而已,自己一直感觉不到这个算法的正确性)。


#include<stdio.h>
#include<string.h>
//******************************************
const int maxm=2000000;  //边的个数
const int maxn=25100;      //点的个数
const int inf=0x3f3f3f3f;typedef struct
{int u,v,w;
}EDGE;
EDGE e[maxm];
int pre[maxn],id[maxn],vis[maxn],in[maxn];
typedef struct
{ int directedMST(int root ,int n ,int m)  {  //从0开始用的 0....N,m条边
       int res=0,nv=n + 1,i;while (1){for (i=0;i<nv;i++){in[i]=inf;}for (i=1;i<=m;i++){int u=e[i].u;int v=e[i].v;if (e[i].w<in[v]&&u!=v){pre[v]=u;in[v]=e[i].w;}}for (i=0;i<nv;i++){if (i==root)continue;if (in[i]==inf)return -1;}int cntnode=0;memset(id,-1,sizeof(id[0])*(nv+3));memset(vis,-1,sizeof(vis[0])*(nv+3));in[root]=0;for (i=0;i<nv;i++){res+=in[i];int v=i;while (vis[v]!=i&&id[v]==-1&&v!=root){vis[v]=i;v=pre[v];}if (v!=root&&id[v]==-1){for (int u=pre[v];u!=v;u=pre[u]){id[u]=cntnode;}id[v]=cntnode++;}}if (cntnode==0)break;for (i=0;i<nv;i++){if (id[i]==-1)id[i]=cntnode++;}for (i=1;i<=m;i++){int v=e[i].v;e[i].u=id[e[i].u];e[i].v=id[e[i].v];if (e[i].u!=e[i].v){e[i].w-=in[v];}}nv=cntnode;root=id[root];}return res;}
}M_Tree;
//***************************************
int sum[55];
int num[55];int main ()
{int n ,m ,i ,j;int a ,b ,c ,d ,mo;M_Tree T;while(~scanf("%d %d" ,&n ,&m) && n + m){sum[0] = 0;for(i = 1 ;i <= n ;i ++){scanf("%d" ,&num[i]);num[i] ++;sum[i] = sum[i-1] + num[i];}int tt = 0;while(m--){scanf("%d %d %d %d %d" ,&a ,&b ,&c ,&d ,&mo);b++ ,d ++;for(int i = sum[a-1] + b ;i <= sum[a] ;i ++){e[++tt].u = i;e[tt].v = sum[c-1] + d;e[tt].w = mo;}}for(i = 1 ;i <= n ;i ++){for(j = sum[i-1] + 2 ;j <= sum[i] ;j ++){e[++tt].u = j;e[tt].v = j-1;e[tt].w = 0;}e[++tt].u = 0;e[tt].v = sum[i-1] + 1;e[tt].w = 0;}printf("%d\n",T.directedMST(0 ,sum[n] ,tt));   }return 0;
}

hdu4966 最小树形图(最少辅导花费)相关推荐

  1. hdu4966 最小树形图+虚根

    /* 辛辛苦苦调试半天, 过了样例,竟然没有ac!! 网上对比了ac代码,感觉添加一个虚根就能ac 但是想不明白为什么 */ /* 第二天想了下,知道了为什么wa:因为从等级0连到其他课程等级i的不止 ...

  2. 最小树形图-hdu4966

    https://vjudge.net/contest/311526#problem/G 大意:给定n(50)门属性,每门属性有a[i](500)个级别,同时有M(2000)门课程,参加j号课程需要c属 ...

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

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

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

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

  5. 最小树形图-朱刘算法详解 +例题解析

    文章目录 最小树形图 定义 和最小生成树的区别 朱刘算法 思想 步骤 流程展示 算法实现 例题 POJ3164_Command_Network HDU2121_Ice_cream's_world_II ...

  6. poj3164(最小树形图模版)

    对最小树形图做个小小的总结: 1:清除自环,自环是不可能存在于任何最小树形图中的: 2:求出每个顶点的的最小入边: 3:判断该图是否存在最小树形图,由 1 可以判定,或者以图中顶点v作为根节点遍历该图 ...

  7. 【ZOJ - 3946】Highway Project(最短路子图,维护双权值,贪心,最小树形图)

    题干: Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he ...

  8. 【转】【最小树形图】有向图的最小生成树【朱刘算法】

    这篇文章挺好的.每行还有注释QAQ,kuangbin的模板里并没有万能节点: 万能节点好像是在不定根的时候的拓展. 要点: 1.求所有边权和sum; 2.以0点为万能节点向所有点建一条权值为sum的边 ...

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

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

最新文章

  1. 《LeetCode力扣练习》第55题 跳跃游戏 Java
  2. 列表表格以及媒体元素
  3. python函数式编程读取数据时出现错误_写 Python 代码不可不知的函数式编程技术...
  4. 两道二分coming~
  5. django-演练-英雄-作品-对应关系
  6. 软件测试学生管理系统课程设计,软件测试课程设计-ERP进销存管理系统(1)
  7. JavaScript入门笔记
  8. linux去掉日志中的skipping,Linux日志文件总管 logrotate
  9. 顶顶顶!! Xcode7.1下用CocoaPods安装Alamofire--swift下的第三方网络库
  10. java实验报告实验思路_20145307第一周JAVA实验报告
  11. html英文特殊字体代码,字体_中英文字体等(示例代码)
  12. 大合集!近两年目标跟踪资源全汇总(论文、模型代码、优秀实验室)
  13. Arcgis用矢量文件裁剪栅格图像
  14. 中文界面blend_Blend Modes v3.4 – unity混合模式插件
  15. kali工具之Beef
  16. android微信小程序自动填表_微信小程序自动化实战(一)
  17. 阿里云1+X-云计算开发与运维-中级(多选题)
  18. 《校园十大优秀青年评比》课程设计作品——顺利通过!!!
  19. java getiotype_坑爹微信之读取PKCS12流时出现的java.io.IOException: DerInputStream.getLength...
  20. Oracle 中启动 Scott 用户 的方法

热门文章

  1. Intellij IDEA中的Mybatis Plugin破解
  2. Tomcat中配置MySQL数据库连接池
  3. 30道四则运算题目---课堂作业--软件工程c++
  4. 把握现在才是最重要的
  5. IBatis.Net学习笔记系列文章
  6. ORz.....-0-
  7. 黑暗城堡-(最小生成树+最短路)
  8. springboot 异步不生效
  9. BZOJ 2959: 长跑 解题报告
  10. python 3389爆破机