HDU 4966 GGS-DDU(最小树形图)
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-based
int 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;
}
HDU 4966 GGS-DDU(最小树形图)的更多相关文章
- HDU 4009 Transfer water 最小树形图
分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
- hdu 2121无根最小树形图要建一个虚拟节点
#include<stdio.h> #include<string.h> #define inf 999999999 #define N 1100 struct node { ...
- hdu 4966 GGS-DDU (最小树形图)
比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- HDU 6141 I am your Father!(最小树形图+权值编码)
http://acm.hdu.edu.cn/showproblem.php?pid=6141 题意: 求最大树形图. 思路: 把边的权值变为负值,那么这就是个最小树形图了,直接套模板就可以解决. 有个 ...
- HDU 6141 I am your Father!(最小树形图)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] ...
- HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】
Ice_cream’s world II Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- hdu 2121 Ice_cream’s world II (无定根最小树形图)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目大意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费. 解题思路: 1:构造 ...
随机推荐
- scp命令的用法详解
这篇文章主要是参考了http://blog.csdn.net/jiangkai_nju/article/details/7338177这个博客,要看详细的内容可以参考这个博客进行学习研究,但是我觉得在 ...
- nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
修改nginx配置参数后,使用nginx -t检查配置. 提示successfull后就可以使用 nginx -s reload来重新加载配置 我配置的过程中遇到这样的问题,就是绑定了主机名后,重新加 ...
- RTX二次开发(一)(基于ASP.NET)
腾讯通RTX是(Real Time eXpert)是腾讯公司推出的企业级实时通信平台,致力于帮助企业提高运作效率.降低沟通成本.拓展商业机会,是一种高度可管理.低成本.易部署的IT平台.RTX集成了丰 ...
- 【Junit】The import org.junit.Test conflicts with a type defined in the same file报错
引入Junit后,进行单元测试,莫名其妙报了个这样的错误 The import org.junit.Test conflicts with a type defined in the same fil ...
- 【bzoj1036】[ZJOI2008]树的统计Count
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- hdu.1067.Gap(bfs+hash)
Gap Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Ubuntu 12 修改环境变量
Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ...
- Python-Matplotlib安装及简单使用
在使用NumPy进行学习统计计算时是枯燥的,大量的数据令我们很头疼,所以我们需要把它图形化显示. Matplotlib是一个Python的图形框架,类似于MATLAB和R语言. Matplotlib的 ...
- Java Io 字符流
Java Io 字符流包含: 1. InputStreamReader 它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite 它是char流到byt ...
- PyCharm 5 破解注册方法
方法: 调整时间到2038年. 申请30天试用 退出pycharm 时间调整回来即可. 或者: 注册时选择 License server ,填 http://idea.lanyus.com ,然后点击 ...