HDU:GGS-DDU

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4966

题目大意:有$n$个课程,初始都在等级$0$,每个课程需要达到等级$a[i]$.满足$x$课程等级大于等于$dx$时,可花费$w$使得$y$课程等级达到$dy$,求最少需要多少钱?

最小树形图

一个有向图若存在从某个点开始的到达所有的的一个最小生成树,则它就是最小树形图。

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

为每个课程的每个等级设置结点,若$x$课程等级大于等于$dx$时,可花费$w$使得$y$课程等级达到$dy$,则

建一条从$x$课程等级等于$dx$的点到$y$课程等级等于$dy$的点,长度为$w$的有向边.

因为课程等级是向下兼容的,即等级高的点可以无消耗达到等级低的点,故每个课程等级高的点向等级低的点建长度为$0$的边.

从而,求最小代价转化为了求整张图的最小树形图(若某课程达到最高等级那么一定可以达到较低等级).

求最小树形图的复杂度为$O(VE)$.

代码如下:

  1 #include <cstdio>
  2 #include <vector>
  3 #include <cstring>
  4 #define N 55
  5 #define MAXN 25055
  6 #define MAXM 30000
  7 using namespace std;
  8 const int inf=10000000;
  9 int n,m,a[N];
 10 struct ZL{
 11     int n,m;
 12     int pre[MAXN],id[MAXN],vis[MAXN];
 13     int inEdge[MAXN];
 14     struct Edge{
 15         int u,v;
 16         int w;
 17     }edge[MAXM];
 18     void init(int n_){
 19         n=n_;m=0;
 20     }
 21     void addedge(int u,int v,int w){
 22         edge[m].u=u;
 23         edge[m].v=v;
 24         edge[m].w=w;
 25         m++;
 26     }
 27     int Directed_MST(int root){
 28         int ans=0,u,v;
 29         while(1){
 30             for(int i=0;i<n;++i)
 31                 inEdge[i]=inf;
 32             for(int i=0;i<m;++i){
 33                 u=edge[i].u;
 34                 v=edge[i].v;
 35                 if(edge[i].w<inEdge[v]&&u!=v) {
 36                     pre[v]=u;
 37                     inEdge[v]=edge[i].w;
 38                 }
 39             }
 40             for(int i=0;i<n;++i)
 41                 if(i!=root&&inEdge[i]==inf)
 42                     return -1;
 43             int cnt=0;
 44             memset(id,-1,sizeof(id));
 45             memset(vis,-1,sizeof(vis));
 46             inEdge[root]=0;
 47             for(int i=0;i<n;++i) {
 48                 ans+=inEdge[i];
 49                 int cur=i;
 50                 while(vis[cur]!=i&&cur!=root&&id[cur]==-1) {
 51                     vis[cur]=i;
 52                     cur=pre[cur];
 53                 }
 54                 if(cur!=root&&id[cur]==-1) {
 55                     v=pre[cur];
 56                     while(v!=cur) {
 57                         id[v]=cnt;
 58                         v=pre[v];
 59                     }
 60                     id[cur]=cnt++;
 61                 }
 62             }
 63             if(cnt==0)
 64                 return ans;
 65             for(int i=0;i<n;++i)
 66                 if(id[i]==-1)
 67                     id[i]=cnt++;
 68             for(int i=0;i<m;++i){
 69                 u=edge[i].u;
 70                 v=edge[i].v;
 71                 edge[i].u=id[u];
 72                 edge[i].v=id[v];
 73                 if(id[u]!=id[v])
 74                     edge[i].w-=inEdge[v];
 75             }
 76             n=cnt;
 77             root=id[root];
 78         }
 79         return ans;
 80     }
 81 }gao;
 82 int main(void){
 83     while(~scanf("%d%d",&n,&m)){
 84         if(n==0&&m==0)break;
 85         a[0]=1;
 86         for(int i=1;i<=n;++i){
 87             scanf("%d",&a[i]);
 88             a[i]+=a[i-1]+1;
 89         }
 90         gao.init(a[n]);
 91         for(int i=1;i<=n;++i){
 92             gao.addedge(0,a[i-1],0);
 93             for(int j=a[i-1];j<a[i]-1;++j)
 94                 gao.addedge(j+1,j,0);
 95         }
 96         for(int i=0;i<m;++i){
 97             int x,dx,y,dy,w;
 98             scanf("%d%d%d%d%d",&x,&dx,&y,&dy,&w);
 99             gao.addedge(a[x-1]+dx,a[y-1]+dy,w);
100         }
101         printf("%d\n",gao.Directed_MST(0));
102     }
103 }

转载于:https://www.cnblogs.com/barrier/p/6852833.html

HDU 4966:GGS-DDU相关推荐

  1. HDU 3507:Print Article

    HDU 3507:Print Article 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题目大意:给定$n$,$m$,输出序列$n$个数, ...

  2. Java算法_优先队列和PriorityQueue——HDU 1873:看病要排队

    目录 优先队列和PriorityQueue HDU 1873:看病要排队 java.util.Comparator 优先队列和PriorityQueue java.util.PriorityQueue ...

  3. HDU 6146:Pokémon GO

    HDU 6146:Pokémon GO 题目 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  4. HDU 1498:50 years, 50 colors(二分图匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1498 题意:给出一个 n*n 的矩阵,里面的数字代表一种颜色,每次能炸掉一排或者一列的相同颜色的气球,问有哪些颜 ...

  5. HDU 4283:You Are the One(区间DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有n个数字,不操作的情况下从左到右按顺序输出,但是可以先让前面的数字进栈,让后面的数字输出,然后栈里 ...

  6. HDU 2444:The Accomodation of Students(二分图判定+匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...

  7. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to t ...

  8. HDU 5794:A Simple Chess(Lucas + DP)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走.里 ...

  9. HDU 1827:Summer Holiday(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. 1 #includ ...

最新文章

  1. PyTorch代码调试利器: 自动print每行代码的Tensor信息
  2. WKWebView免登陆,配置cookie
  3. Spring Security之短信登录
  4. 【学习笔记】23、读写文件(I/O操作)— 写文件
  5. STM32 进入Stop模式后电流还是很大怎么办?
  6. python PIL 打开\显示\保存图像
  7. opengl绘制长方体线框_OpenGL绘制长方体
  8. Linux运维系统工程师系列---13
  9. MySQL索引知识复习
  10. java unexpected type_意外类型需要变量找到值(Unexpected type required variable found value)...
  11. 怎么查找电脑中的流氓软件_玻璃丝网印刷过程中油墨出现问题怎么查找原因解决问题?...
  12. dolphin.php 视频,DolphinPHP V1.0.4发布
  13. WIN8禁用休眠功能
  14. java数字转大写_java实现数字转大写的方法
  15. 手机支付宝服务器安全证书安装不了,手机上如何安装支付宝的安全证书?
  16. JavaScript实现超级玛丽小游戏
  17. c datetime 格式化
  18. 循序渐进大数据组件之--【Zookeeper 03】进阶(选举机制以及ZBA协议)
  19. 基于Tablestore的Wifi设备监管系统架构实现 1
  20. cad调了比例因子没反应_天正CAD标注比例大小调整方法

热门文章

  1. 网站是什么,网站的作用
  2. 学习3D视觉太痛苦了,有哪些高效地学习方法呢?
  3. ubuntu16.04下载安装百度网盘(实测可行)
  4. 剖析品牌出海故事,行云全球汇价值凸显
  5. 强化学习 Sarsa Q-learning:on off policy策略下的时序差分控制
  6. 金融业务-金融市场的分类以及重要性
  7. python中两个字典如何合并为一个_python怎么合并两个字典
  8. CRO必备数据查询平台/分析软件(每个都是精华)
  9. 用ObjectDock做自己的siderbar,很酷.
  10. 解析四种红颜薄命的女人面相特征,长得漂亮命却苦