来自九野~

给定n个技能,m个限制

下面是每个技能满级的级数

开始每个技能都是0级。

m个限制

(c,l1) (d,l2) cost

若c技能已经>=l1级,那么把点亮d技能 从0级一路点到l2级的花费是cost

。。他说的好有道理,我竟无言以对 _(:зゝ∠)_

最小树形图,用0做根,触发每个技能的0级花费是0

若已经点亮技能的x级,则点亮该技能的x-1级花费就是0

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
/*
* 最小树形图
* 复杂度O(NM)
* 点下标[0,n-1] 边下标[0,m-1]
* 有向边表示:u->v 花费为cost
* 返回最小树形图的边权和,-1表示不存在最小树形图
*/
const int INF = 100000000;
const int MAXN = 1010; //点数
const int MAXM = 1010000;//边数
#define ll int
struct Edge{int u,v;ll cost;
}edge[MAXM];
int pre[MAXN],id[MAXN],visit[MAXN],edgenum;
void add(int u, int v, ll cost){Edge E = {u, v, cost}; edge[edgenum++] = E;
}ll in[MAXN];
ll zhuliu(int root,int n,int m,Edge edge[])//树根(注意是有向树,树根不能任意) 点数 边数 edge
{int u,v;ll res=0;while(1){for(int i = 0;i < n;i++)in[i] = INF;for(int i = 0;i < m;i++)if(edge[i].u != edge[i].v && edge[i].cost < in[edge[i].v]){pre[edge[i].v] = edge[i].u;in[edge[i].v] = edge[i].cost;}for(int i = 0;i < n;i++)if(i != root && in[i] == INF)return -1;//不存在最小树形图int tn = 0;memset(id,-1,sizeof(id));memset(visit,-1,sizeof(visit));in[root] = 0;for(int i = 0;i < n;i++){res += in[i];v = i;while( visit[v] != i && id[v] == -1 && v != root){visit[v] = i;v = pre[v];}if( v != root && id[v] == -1 ){for(int u = pre[v]; u != v ;u = pre[u])id[u] = tn;id[v] = tn++;}}if(tn == 0)break;//没有有向环for(int i = 0;i < n;i++)if(id[i] == -1)id[i] = tn++;for(int i = 0;i < m;){v = edge[i].v;edge[i].u = id[edge[i].u];edge[i].v = id[edge[i].v];if(edge[i].u != edge[i].v)edge[i++].cost -= in[v];elseswap(edge[i],edge[--m]);}n = tn;root = id[root];}return res; //-1为不存在最小树形图
}
void init(){edgenum = 0;
}
#define N 55
int n, m, a[N], sum[N];
int Hash(int i, int j){return sum[i-1]+j;
}
int main(){int i, j, c, l1, d, l2, cost;while(scanf("%d %d",&n,&m), n+m){init();sum[0] = 0;for(i = 1; i <= n; i++)scanf("%d",&a[i]), a[i]++, sum[i] = sum[i-1]+a[i];for(i = 1; i <= n; i++)add(0, Hash(i,1), 0);for(i = 1; i <= n; i++)for(j = 2; j <= a[i]; j++)add(Hash(i,j), Hash(i,j-1), 0);while(m--) {scanf("%d %d %d %d %d",&c, &l1, &d, &l2, &cost);l1++; l2++;add(Hash(c,l1), Hash(d,l2), cost);}printf("%d\n", zhuliu(0, sum[n]+1, edgenum, edge));}return 0;
}

转载于:https://www.cnblogs.com/vermouth/p/3977538.html

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. F5 云应用服务促进公共云、私有云及混合云应用部署
  2. Unbuntu18.04通过apt源方式安装mysql5.7.22
  3. C++重载下标操作符[](二)
  4. oracle 父latch:library cache,library cache latch等待事件
  5. Linux环境配置1
  6. Google hacker的***方法
  7. python数据类型可变和不可变_python可变数据类型vs不可变数据类型
  8. mysql procedure prepare_mysql prepare 存储过程使用
  9. html登陆不刷新flask,Flask Button运行Python而不刷新页面?
  10. 不吹不黑聊聊前端框架--尤雨溪Live整理
  11. excel选择符合条件的行
  12. msp心形16个闪灯c语言程序,心形流水灯程序
  13. 集合——数组容器笔记
  14. Android轻量级APM性能监测方案
  15. 「 JVM基础 」Java双亲委派机制
  16. 23个经过时间考验的应用程序,可以管理您的远程软件开发团队
  17. 华为云的下一程:与中国SaaS软件开发企业一起“乘风破浪”
  18. Android屏幕适配之百分比布局LinearLayout、RelativeLayout、FrameLayout
  19. elementUI angular适合做H5吗
  20. 金融项目经验之代码安全

热门文章

  1. 智云通CRM:销售就是讲故事?
  2. 新侨移民告诉你:为什么要移民新西兰?
  3. 会计信息质量可靠性的案例_论会计信息质量特征及其可靠性
  4. 关于给青轴润轴消除弹簧音[误]
  5. discuz全局数组变量 后台各项设置 完整版
  6. 天朝有一个乞丐姓洪,去天桥要钱 第一天要了1块钱 第二天要了2块钱 第三天要了4块钱 第四天要了8块钱 以此类推 问题: 洪乞丐干10天,收入是多少?
  7. Ubuntu下搜狗拼音突然无法输入中文的解决办法
  8. python 方差_python 方差_python 方差齐性检验_方差 python - 云+社区 - 腾讯云
  9. 《资本之王》书中的精髓:黑石公司是如何成长为全球最顶尖的私募股权投资机构的?
  10. 推荐一款STM32F030K6T6兼容替换灵动MM32F031K6T6