n个技能,每个技能有0~a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]。

输出最小花费使得全技能满级(初始全技能0等级)

n<=50,Σa[i]<=500,m<=2000

点<=551,边<=2000+50+Σ((a[i]+1)*a[i]/2)

Σw[i]<=2000*1000<0x3f3f3f3f

比赛时候完全不在状态,什么题都想不到,坑队友了。。。

最小树形图~做过tarjan缩点的问题应该不大~以前做过不过好像没留下代码现在留下~

攻略步骤:

引用http://www.cnblogs.com/vongang/archive/2012/07/18/2596851.html

引用http://blog.csdn.net/wsniyufang/article/details/6747392

1、找到除了root以为其他点的权值最小的入边。用In[i]记录

2、如果出现除了root以为存在其他孤立的点,则不存在最小树形图。

3、找到图中所有的环,并对环进行缩点,重新编号。
4、更新其他点到环上的点的距离,如:

环中的点有(Vk1,Vk2,… ,Vki)总共i个,用缩成的点叫Vk替代,则在压缩后的图中,其他所有不在环中点v到Vk的距离定义如下:
gh[v][Vk]=min { gh[v][Vkj]-mincost[Vkj] } (1<=j<=i)

而Vk到v的距离为
gh[Vk][v]=min { gh[Vkj][v] }              (1<=j<=i)

5、重复3,4知道没有环为止。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;#define inf 0x3f3f3f3f
#define maxn 566
#define maxm (566*566+2000)struct Edge{int u,v,w;
}e[maxm];
int in[maxn], pre[maxn];
int vis[maxn];
int belong[maxn];
int solve(int root,int n,int esz){// 1-basedint ret=0;while(1){for(int i=1;i<=n;++i) in[i]=inf;for(int i=1;i<=esz;++i){// 找最小边int u=e[i].u, v=e[i].v, w=e[i].w;if(v==u){swap(e[i--],e[esz--]);continue;}if(w<in[v])in[v]=w, pre[v]=u;}for(int i=1;i<=n;++i) if(in[i]==inf && i!=root) return inf;// 无解int cnt=0;memset(belong,-1,sizeof(belong));memset(vis,-1,sizeof(vis));in[root]=0;for(int i=1;i<=n;++i){// 找环ret+=in[i];int v = i;while(vis[v]!=i && belong[v]==-1 && v!=root)vis[v] = i, v = pre[v];if(vis[v]==i){// 有环,重新编号belong[v]=++cnt;for(int u=pre[v];u!=v;u=pre[u])belong[u]=cnt;}}if(cnt==0) break;// 已成型for(int i=1;i<=n;++i) if(belong[i]==-1) belong[i]=++cnt;// 不在环内,重新编号for(int i=1;i<=esz;++i){// 更新环外点和环缩点后的点的距离int v=e[i].v;e[i].u=belong[e[i].u];e[i].v=belong[e[i].v];if(e[i].u!=e[i].v) e[i].w-=in[v];}n=cnt;root=belong[root];}return ret;
}
int main(){int n,m;int a[55],s[55];while(~scanf("%d%d",&n,&m) && n+m){s[0]=1;for(int i=1;i<=n;++i) scanf("%d",a+i), s[i]=s[i-1]+a[i]+1;int esz=0;for(int i=0;i<m;++i){int c,l1,d,l2,w;scanf("%d%d%d%d%d",&c,&l1,&d,&l2,&w);int u=s[c-1]+l1+1, v=s[d-1]+l2+1;++esz;e[esz].u=u,e[esz].v=v,e[esz].w=w;}for(int i=1;i<=n;++i){++esz;e[esz].u=1,e[esz].v=s[i-1]+1,e[esz].w=0;for(int j=0;j<=a[i];++j){for(int k=0;k<j;++k){int u=s[i-1]+j+1,v=s[i-1]+k+1;++esz;e[esz].u=u,e[esz].v=v,e[esz].w=0;}}}int ans=solve(1,s[n],esz);if(ans==inf) puts("-1");else printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/nextbin/p/3924391.html

HDU 4966 GGS-DDU(最小树形图)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. HDU 4966:GGS-DDU

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

最新文章

  1. 用IE重起计算机或者关机
  2. 谷歌为什么把几十亿行代码放在一个库?
  3. 攻下《JavaScript高级程序设计》——第二章 在HTML中使用JavaScript
  4. jittor和pytorch 生成网络对比之clustergan
  5. 用于阴影检测的 DSC 特征
  6. 科大讯飞副总裁刘鹏:人机交互的未来是人人交互?
  7. Java代码性能优化技巧
  8. Python对图像的基本操作
  9. 安装Mathcad过程中的问题——解决无法将注册值写入注册表
  10. grunt之Gruntfile(1)
  11. swift - 关于title问题
  12. IBM Machine Learning学习笔记(二)——Supervised Learning: Regression
  13. 亚马逊Alexa Connect Kit(ACK)
  14. Redis的I/O多路复用
  15. win7计算机窗口无法最小化,Windows7系统任务栏不显示最小化窗口的解决方法
  16. 【自学Python:Day2】磨洋工的我一周一课……
  17. w7测算计算机分级,win7游戏分级系统
  18. (淘宝无限适配)手机端rem布局
  19. 会声会影2023是什么软件,会声会影和pr到底哪个好
  20. IDEA新建本地项目关联远程本地仓库和git仓库详细步骤

热门文章

  1. C++ 自己实现一个unordered_map(hashmap)
  2. 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
  3. Qt 中使用全局变量的方法
  4. 2015C蓝桥杯C++A:格子中输出(详细讲解)
  5. OpenGL基础52:阴影映射(上)
  6. Unity3D基础12:碰撞体
  7. HDU 5693:D Game(区间DP)
  8. Matlab 小波变换dwt和wavedec
  9. (暴力求解)百钱买百鸡问题升级版
  10. 最新高清IT职业技能图谱(15图)