之前几天想着补些算法的知识,学了一下最小树形图的朱刘算法,不是特别理解,备了份模板以备不时之需,想不到多校冷不丁的出了个最小树形图,没看出来只能表示对算法不太理解吧,用模板写了一下,然后就过了。- -0

之前听到是最小树形图的时候觉得恍然大悟,非常裸,但是后来想想也不是特别裸,其实关键就是要想清楚要加回流的边,贴一份代码吧- -0

#pragma warning(disable:4996)
#include<cstdio>
#include<set>
#include<cstring>
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<map>
#include<algorithm>
#include<queue>
#include<cmath>
#include<functional>
#include<string>
using namespace std; #define maxn 550 int n, m;
int a[55]; struct Edge{
int u, v, w;
Edge(int ui, int vi, int wi) :u(ui), v(vi), w(wi){}
Edge(){}
}; vector<Edge> E;
vector<int> vid[55]; int in[maxn]; // minimum pre edge weight
int pre[maxn]; // pre vertex
int vis[maxn]; // vis array
int id[maxn]; // mark down the id
int nv; // nv is the number of vertex after shrinking int directed_mst(int root,int vertex_num)
{
int ret = 0; int nv = vertex_num;
while (1){
for (int i = 0; i < nv; ++i) in[i] = 1e9;
for (int i = 0; i < E.size(); ++i){
int u = E[i].u, v = E[i].v;
if (E[i].w < in[v] && u != v){
in[v] = E[i].w;
pre[v] = u;
}
}
for (int i = 0; i < nv; ++i){
if (i == root) continue;
if (in[i]>1e8) return -1;
}
int cnt = 0;
memset(id, -1, sizeof(id));
memset(vis, -1, sizeof(vis));
in[root] = 0; for (int i = 0; i < nv; ++i){
ret += in[i];
int v = i; while (vis[v] != i&&id[v] == -1 && v != root){
vis[v] = i;
v = pre[v];
}
// v!=root means we find a circle,id[v]==-1 guarantee that it's not shrinked.
if (v != root&&id[v] == -1){
for (int u = pre[v]; u != v; u = pre[u]){
id[u] = cnt;
}
id[v] = cnt++;
}
}
if (cnt == 0) break;
for (int i = 0; i < nv; ++i){
if (id[i] == -1) id[i] = cnt++;
}
// change the cost of edge for each (u,v,w)->(u,v,w-in[v])
for (int i = 0; i < E.size(); ++i){
int v = E[i].v;
E[i].u = id[E[i].u];
E[i].v = id[E[i].v];
if (E[i].u != E[i].v) E[i].w -= in[v];
}
// mark down the new root
root = id[root];
// mark down the new vertex number
nv = cnt;
}
return ret;
} int main()
{
while (cin >> n >> m){
if (n == 0 && m == 0) break;
int tot = 0;
for (int i = 1; i <= n; ++i) {
vid[i].clear();
scanf("%d", a + i);
for (int j = 0; j <= a[i]; ++j){
vid[i].push_back(++tot);
}
}
++tot;
E.clear();
for (int i = 1; i <= n; ++i){
for (int j = 0; j < vid[i].size(); ++j){
for (int k = j + 1; k < vid[i].size(); ++k){
E.push_back(Edge(vid[i][k], vid[i][j], 0));
}
}
}
int ci, l1, di, l2, wi;
for (int i = 0; i < m; ++i){
scanf("%d%d%d%d%d", &ci, &l1, &di, &l2, &wi);
E.push_back(Edge(vid[ci][l1], vid[di][l2], wi));
}
for (int i = 1; i <= n; ++i){
E.push_back(Edge(0, vid[i][0], 0));
}
int ans = directed_mst(0,tot);
printf("%d\n", ans);
}
return 0;
}

HDU4966 GGS-DDU(最小树形图)的更多相关文章

  1. hdu4966 最小树形图+虚根

    /* 辛辛苦苦调试半天, 过了样例,竟然没有ac!! 网上对比了ac代码,感觉添加一个虚根就能ac 但是想不明白为什么 */ /* 第二天想了下,知道了为什么wa:因为从等级0连到其他课程等级i的不止 ...

  2. 最小树形图(hdu4966多校联赛9)

    GGS-DDU Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  3. hdu4966 最小树形图(最少辅导花费)

    题意:       以一些科目,和辅导班,每个科目最终要求修到某个等级,可以花一定的钱在辅导班把某一科目修到某一等级,进入辅导班的时候会有一个限制,那就是达到他给出的科目和等级限制,比如a b c d ...

  4. bzoj4349: 最小树形图

    最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...

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

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

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

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

  7. hdu3072 强连通+最小树形图

    题意:有一个人他要把一个消息通知到所有人,已知一些通知关系:A 能通知 B,需要花费 v,而又知道,如果某一个小团体,其中的成员相互都能直接或间接通知到,那么他们之间的消息传递是不需要花费的,现在问这 ...

  8. POJ3164 Command Network(最小树形图)

    图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...

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

    [解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...

随机推荐

  1. Python性能优化的20条建议 (转载)

    优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...

  2. hdu 2647 Reward

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2647 Reward Description Dandelion's uncle is a boss o ...

  3. Run ionic web app in nodejs

    首先需要express插件:sudo npm install express 将ionic project的www拷贝至wwwroot,新建server.js: var express = requi ...

  4. MVC4.0网站发布和部署到IIS7.0上的方法【转:http://www.th7.cn/Program/net/201403/183756.shtml】

    最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不 ...

  5. notepad++ erlang开发环境设置

    初学erlang 网上有使用eclipse的,有使用emacs的,尝试了一下, 感觉太麻烦,来试试notepad++吧. 有什么新使用方法会再更新上来,for you for me. 1.语法高亮: ...

  6. 为iPhone6设计自适应布局

    Apple从iOS6加入了Auto Layout后开始就比较委婉的开始鼓励.建议开发者使用自适应布局,但是到目前为止,我感觉大多数开发者一直在回避这个问题,不管是不是由于历史原因造成的,至少他们在心底 ...

  7. FTP上传文件夹

    文件上传类 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; usi ...

  8. pxe+preseed安装配置(2)

    1.tftp使用独立daemon,这样不用再安装xinet, apt-get install tftp-hpa tftpd-hpa cat /etc/default/tftpd-hpa TFTP_US ...

  9. 搭建SpringMVC+MyBatis开发框架六

    建立Springmvc包结构 1.看看我们在springmvc.xml中曾经配置过扫描net.quickcodes这个包下面的所有java文件:  现在我们就在"src/main/java ...

  10. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...