将每门课等级拆成0,1,2,3...a[i]个点,对每一个等级大于0的点向它低一级连边,权值为0【意思是,若修了level k。则level(0~k)都当做修了】

将输入的边建边,权值为money[i]。

建立根节点,向每一个level 0的点连边,权值为0【由于初始level 0的都修了】

因为题目要求每门课都必须达到最大level,也就是相应图中根节点能到达全部点,问题就变成了求有向图的最小生成树。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm> using namespace std;
#define INF 0x3FFFFFF
#define MAXN 5555
struct edge
{
int u,v,w;
}e[9999999];
int n,en;
int pre[MAXN],in[MAXN],id[MAXN],vis[MAXN];
void add(int u,int v,int w)
{
e[en].u=u;
e[en].v=v;
e[en++].w=w;
}
int zl(int root ,int vn)
{
int ans=0;
int cnt;
while(1)
{
for(int i=0;i<vn;i++)
in[i]=INF,id[i]=-1,vis[i]=-1;
for(int i=0;i<en;i++)
{
if(in[e[i].v]>e[i].w && e[i].u!=e[i].v)
{
pre[e[i].v]=e[i].u;
in[e[i].v]=e[i].w;
}
}
in[root]=0;
pre[root]=root;
for(int i=0;i<vn;i++)
{
ans+=in[i];
if(in[i]==INF)
return -1;
}
cnt=0;
for(int i=0;i<vn;i++)
{
if(vis[i]==-1)
{
int t=i;
while(vis[t]==-1)
{
vis[t]=i;
t=pre[t];
}
if(vis[t]!=i || t==root) continue;
for(int j=pre[t];j!=t;j=pre[j])
id[j]=cnt;
id[t]=cnt++;
}
}
if(cnt==0) break;
for(int i=0;i<vn;i++)
if(id[i]==-1)
id[i]=cnt++;
for(int i=0;i<en;i++)
{
int u,v;
u=e[i].u;
v=e[i].v;
e[i].u=id[u];
e[i].v=id[v];
e[i].w-=in[v];
}
vn=cnt;
root=id[root];
}
return ans;
}
int a[MAXN],pres[MAXN];
int main()
{
int x,y,b,c,d,m;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),
pres[i]=pres[i-1]+a[i]+1;
en=0;
int s=0;
int t=pres[n]+1;
for(int i=1;i<=n;i++)
{
for(int id=1;id<=a[i];id++)
{
add(pres[i-1]+id+1,pres[i-1]+id,0);
// printf("%d -> %d\n",pres[i-1]+id+1,pres[i-1]+id);
}
add(s,pres[i-1]+1,0);
// printf("%d -> %d\n",pres[i-1]+a[i]+1,t);
// printf("%d -> %d\n",s,pres[i-1]+1);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d%d",&x,&y,&b,&c,&d);
add(pres[x-1]+y+1,pres[b-1]+c+1,d);
// printf("%d -> %d\n",pres[x-1]+y+1,pres[b-1]+c+1);
}
int tmp=zl(0,t);
if(tmp<0) puts("-1");
else printf("%d\n",tmp);
}
return 0;
}

hdu 4966 最小树形图的更多相关文章

  1. hdu 4009 最小树形图模板题朱刘算法

    #include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...

  2. hdu 4009 最小树形图

    思路:唯一一个值得一提的就是建一个0号根节点,往每个房子建一条边,权值为房子的高度乘以X. #include<iostream> #include<cstdio> #inclu ...

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

    比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...

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

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

  5. HDU 2121 Ice_cream’s world II 最小树形图 模板

    开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  6. HDU 6141 I am your Father!(最小树形图+权值编码)

    http://acm.hdu.edu.cn/showproblem.php?pid=6141 题意: 求最大树形图. 思路: 把边的权值变为负值,那么这就是个最小树形图了,直接套模板就可以解决. 有个 ...

  7. HDU 6141 I am your Father!(最小树形图)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] ...

  8. HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】

    Ice_cream’s world II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  9. hdu 2121 Ice_cream’s world II (无定根最小树形图)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目大意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费. 解题思路: 1:构造 ...

随机推荐

  1. git在win7下安装的问题

    本帖最后由 ikscher 于 2015-07-30 20:24:16 编辑 从官网下载的最新版本号git-1.9.2-preview版本号,安装在还有一台win7下没有此错误,可是安装在当中一台出现 ...

  2. 2015.04.20,外语,读书笔记-《Word Power Made Easy》 11 “如何辱骂敌人” SESSION 30

    1.brothers and sisters, wives and husbands Frater: brothers; soror: sister; uxor: wife; maritus: hus ...

  3. [POJ 1316] 树上的询问

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1316 [算法] 点分治 由于边权较大,笔者在计算时使用了STL-set 注意当询问为 ...

  4. Linux下安装桌面

    1.         安装之前先测试是否有桌面 2.         建立yum源文件   3.         挂载好光盘(/rhel自己创建)   4.         使用yum list 查看 ...

  5. django前端到后端一次完整请求实例

    一.创建项目:# django-admin startproject mysite# cd mysite# python manage.py startapp blog 目录结构: 一.html文件: ...

  6. Unity脚本中可以引用的类型

    Hierarchy(层级视图)面板里的对象,或者 Project(工程视图)里的Prefab.

  7. Python-超好用的Django源码解析

    http://djangobook.py3k.cn/2.0/

  8. video标签实现简单视频背景+遇到问题(视频无法显示,不能自动播放)

    最近看网上有一些网站首页背景是炫酷的视频背景,就想模拟一个 1.video标签简介 video标签定义视频,就是可以在网页上实现视频的播放,详情见http://www.w3school.com.cn/ ...

  9. 算法23-------岛屿的最大面积 LeetCode 695

    一.题目: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到给定 ...

  10. Python笔记25-----------创建二维列表【浅copy】和转置

    一.创建二维列表 1.二维列表创建第二维的时候,如果采用*2这种方式,这是一种浅复制的方式,同时引用到同一个list,如上图的C. 这种形式,不方便修改C[ i ][ j ]的数据,如果改C[ 0 ] ...