HDU 6141 I am your Father!(最小树形图+权值编码)
http://acm.hdu.edu.cn/showproblem.php?pid=6141
题意:
求最大树形图。
思路:
把边的权值变为负值,那么这就是个最小树形图了,直接套模板就可以解决。
有个问题就是n结点的父亲结点的编号要尽量小,这里有个技巧可以用,权值编码,将所有边的权值都放大1000倍,对于和n相连的边,每条边在减去(n-u)的权值。这样就会去优先考虑编号小的边,而且因为权值最大为100,所以扩大1000是不会影响结果的。
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<sstream>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<cmath>
- #include<map>
- #include<set>
- using namespace std;
- typedef long long ll;
- typedef pair<int,ll> pll;
- const int inf = 0x3f3f3f3f;
- const int maxn=+;
- const int mod=1e9+;
- int n, m;
- struct node
- {
- int u,v,w;
- }edge[*maxn];
- int pre[maxn],id[maxn],use[maxn];
- int in[maxn];
- int mini_tree(int root,int n,int m)//分别是树根,节点数,边数,序号从1开始
- {
- int ans=;
- int u;
- while(true)
- {
- for(int i=;i<=n;i++) in[i]=inf;
- for(int i=;i<=m;i++)
- {
- int u=edge[i].u;
- int v=edge[i].v;
- if(edge[i].w<in[v]&&u!=v)
- {
- in[v]=edge[i].w;
- pre[v]=u;
- }
- }//找最小的入边
- for(int i=;i<=n;i++)
- {
- if(i==root)continue;
- ans+=in[i];//把边权加起来
- if(in[i]==inf)//如果存在没有入弧的点则不存在最小树形图
- return -;
- }
- memset(id,-,sizeof(id));
- memset(use,-,sizeof(use));
- int cnt=;
- for(int i=;i<=n;i++)//枚举每个点,搜索找环
- {
- int v=i;
- while(v!=root&&use[v]!=i&&id[v]==-)
- {
- use[v]=i;
- v=pre[v];
- }
- if(v!=root&&id[v]==-)//当找到环的时候缩点编号
- {
- ++cnt;
- id[v]=cnt;
- for(u=pre[v];u!=v;u=pre[u])
- id[u]=cnt;
- }
- }
- if(cnt==)//如果没有环结束程序
- break;
- for(int i=;i<=n;i++)//把余下的不在环里的点编号
- if(id[i]==-)
- id[i]=++cnt;
- for(int i=;i<=m;i++)//建立新的图
- {
- int u=edge[i].u;
- int v=edge[i].v;
- edge[i].u=id[u];
- edge[i].v=id[v];
- if(edge[i].u!=edge[i].v)
- edge[i].w-=in[v];
- }
- n=cnt;//更新节点数和根节点的编号
- root=id[root];
- }
- return ans;
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=m;i++)
- {
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- w*=-;
- if(v==n) w-=(n-u);
- edge[i].u=u, edge[i].v=v, edge[i].w=w;
- }
- int ans=mini_tree(,n,m);
- printf("%d %d\n",-ans/,n-(-ans)%);
- }
- return ;
- }
HDU 6141 I am your Father!(最小树形图+权值编码)的更多相关文章
- HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8
思路来自 FXXL 最小树形图模板用kuangbin的 /* HDU 6141 - I am your Father! [ 最小树形图 ] | 2017 Multi-University Traini ...
- The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp
文件链接 Karp在1977年的论文,讲述了一种\(O(nm)\)的算法,用来求有向强连通图中最小平均权值回路(具体问题请参照这里) 本人翻译(有删改): 首先任取一个节点 \(s\) ,定义 \(F ...
- HDU 6141 I am your Father!(最小树形图)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] ...
- hdu 6141 I am your Father!
题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6141 (2017 Multi-University Training Contest - Team ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- HDU 2121 Ice_cream’s world II 最小树形图
这个题就是需要求整个有向带权图的最小树形图,没有指定根,那就需要加一个虚根 这个虚根到每个点的权值是总权值+1,然后就可以求了,如果求出来的权值大于等于二倍的总权值,就无解 有解的情况,还需要输出最根 ...
- hdu 3072 有向图缩点成最小树形图计算最小权
题意,从0点出发,遍历所有点,遍历边时候要付出代价,在一个SCC中的边不要付费.求最小费用. 有向图缩点(无需建立新图,,n<=50000,建则超时),遍历边,若不在一个SCC中,用一个数组更新 ...
- hdu 1565&hdu 1569(网络流--最小点权值覆盖)
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 1875 给出每个结点的坐标 权值为两点间的距离 (MST)
Sample Input2210 10 //坐标20 2031 12 21000 1000 Sample Output1414.2 //最小权值和*100 保留1位小数oh! //不 ...
随机推荐
- Ubuntu16.04 安装 “宋体,微软雅黑,Consolas雅黑混合版编程字体” 等 Windows 7 下的字体
Windows平台下,“宋体”.“微软雅黑”.“Courier New(编程字体)”用的比较多,看的也习惯了.那如何在 Ubuntu下也安装这些字体呢? 操作步骤如下: 第一步:从 Windows 7 ...
- gerrit 使用教程(一)
原文地址:https://www.jianshu.com/p/b77fd16894b6 1, Gerrit是什么? Gerrit实际上一个Git服务器,它为在其服务器上托管的Git仓库提供一系列权限控 ...
- mysql中char和varchar详解
一.首先创建表. CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `a` char(255) DEFAULT NULL) ENGINE=InnoDB DE ...
- 集合框架—常用的map集合
1.Collections.synchronizedMap() 实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁. ...
- SV中的Interface和Program
Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface arb_ ...
- SQL Server报“GUID应包含带4个短划线的32位数”
转自:http://www.seayee.net/article/info_106.html 最近在配置一台服务器的MS SQL Server 2005的维护计划自动备份数据库,能创建维护计划,但设置 ...
- SSRS创建复合型图表
SSRS创建复合型图表 1.添加报表数据对应代码: if object_id('tb') is not null drop table tb; go CREATE TABLE tb(yearid in ...
- MIPSsim使用说明
MIPSsim下载:https://files.cnblogs.com/files/jiangxinnju/MIPSsim.zip 启动模拟器 双击MIPSsim.exe,即可启动该模拟器.MIPSs ...
- web前端----JavaScript(JS)简单介绍
JavaScript(JS) 一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEa ...
- mysql 触发器 trigger用法 four
实验4 触发器 (1)实验目的 掌握数据库触发器的设计和使用方法 (2)实验内容和要求 定义BEFORE触发器和AFTER触发器.能够理解不同类型触发器的作用和执行原理,验证触发器的有效性. (3)实 ...