hdu2121 最小树形图的虚根
/*
最小树形图的第二题,终于有了一些理解
具体看注释
*/
/*
无定根的最小树形图
建立虚root
每次只找最短的那条入边
最小树形图理解:
第一步:寻找最短弧集E:扫一遍所有的边,找到每个点权值最小的入边,这一步会产生环
第二步:对每个点 i 找环:通过第一步记录的前驱找环,如果找到了原点或退到了另一个环,点i找环失败
第三步:缩点,缩点就是染色,把每个环内的点染上同一种颜色,每个环内点打上同一个id
第四步:更新一次边集:如果一条边连接两个不同颜色的点,就该边这条边的权值
重复以上四步。 最小树形图的root:root不需要入边
最小树形图的实质是最小生成树,所以用贪心的思想解决,但是贪心找入边时会生产环(第一步)
因此还得找另外一条边连到那个环中,才能解决这个环(第四步) 不定根确定根需要加一个虚根,由虚根为超级源点建立最小生成树,
这样由超级源点出发到达的第一个点就是实际最小生成树的根
虚根和每条边链接一条虚边,其权值要大于实根的和,以此判断是否连了两条虚边(建图失败) 如何找到那个实根:在不断形成环的过程中,会最先有一个点最先和虚根相连,这个点就是实根(实根是不需要入边的,但是在加了虚根后,实根不再是根)
贪心思想保证第一个和虚根链接的必定是实根
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define MAXN 1005
#define INF 0x3f3f3f
using namespace std;
struct Edge{
ll u,v,cost;
}edge[MAXN*MAXN];
ll pos;
int pre[MAXN],id[MAXN],visit[MAXN];
ll in[MAXN];
ll zhuliu(int root,int n,int m){
int res=;
int u,v;
while(){
for(int i=;i<n;i++)
in[i]=INF;
for(int i=;i<m;i++)
if(edge[i].u!=edge[i].v && edge[i].cost<in[edge[i].v]){
in[edge[i].v]=edge[i].cost;
pre[edge[i].v]=edge[i].u;
if(edge[i].u==root)
pos=i;
}
for(int i=;i<n;i++)
if(i!=root && in[i]==INF)
return -; int tn=;
memset(id,-,sizeof id);
memset(visit,-,sizeof visit);
in[root]=;
for(int i=;i<n;i++){
res+=in[i];
v=i;
while(visit[v]!=i && id[v]==- && v!=root){
visit[v]=i;
v=pre[v];
}
if(v!=root && id[v]==-){
for(int u=pre[v];u!=v;u=pre[u])
id[u]=tn;
id[v]=tn++;
}
} if(tn==)
break;//已经没有环了
for(int i=;i<n;i++)
if(id[i]==-)
id[i]=tn++; 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(id[u] != id[v])
edge[i].cost-=in[v];
}
n=tn;
root=id[root];
}
return res;
}
int main(){
ll n,m;
while(scanf("%lld%lld",&n,&m)==){
ll sum=;
for(ll i=;i<m;i++){ scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].cost);
edge[i].u++;edge[i].v++;
sum+=edge[i].cost;
} int root=n,tot=m;//加入虚根
for(ll i=m;i<n+m;i++){
edge[i].u=;
edge[i].v=i-m+;
edge[i].cost=sum+;
} ll ans=zhuliu(,n+,n+m);
if(ans==- || ans-(sum+)>=sum+)
printf("impossible\n\n");
else
printf("%lld %lld\n\n",ans-(sum+),pos-m);
}
return ;
}
hdu2121 最小树形图的虚根的更多相关文章
- hdu4966 最小树形图+虚根
/* 辛辛苦苦调试半天, 过了样例,竟然没有ac!! 网上对比了ac代码,感觉添加一个虚根就能ac 但是想不明白为什么 */ /* 第二天想了下,知道了为什么wa:因为从等级0连到其他课程等级i的不止 ...
- hdu2121 Ice_cream’s world II 最小树形图(难)
这题比HDU4009要难一些.做了4009,大概知道了最小树形图的解法.拿到这题,最直接的想法是暴力.n个点试过去,每个都拿来做一次根.最后WA了,估计是超时了.(很多题都是TLE说成WA,用了G++ ...
- hdu2121无定根的最小树形图
无定根的最小树形图,像网络流的超级源和超级汇一样加一个起点,用邻接表(n>1000) n<1000用邻接矩阵 #include<map> #include<set> ...
- HDU2121 Ice_cream’s world II —— 最小树形图 + 不定根 + 超级点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 Ice_cream’s world II Time Limit: 3000/1000 MS (J ...
- HDU ACM 2121 Ice_cream’s world II (无根最小树形图)
[解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...
- HDU 2121 Ice_cream’s world II 不定根最小树形图
题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 2121 Ice_cream’s world II 最小树形图
这个题就是需要求整个有向带权图的最小树形图,没有指定根,那就需要加一个虚根 这个虚根到每个点的权值是总权值+1,然后就可以求了,如果求出来的权值大于等于二倍的总权值,就无解 有解的情况,还需要输出最根 ...
- 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 (无定根最小树形图)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目大意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费. 解题思路: 1:构造 ...
随机推荐
- Spring 源码分析 spring-core 篇
先来看下 spring-core 的包结构 总共有6个模块,分别是 asm.cglib.core.lang.objenesis.util asm包: 用来操作字节码,动态生成类或者增强既有类的功能.主 ...
- eureka 学习
Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS c ...
- 获取汉字拼音&首字母
pinyin4j https://www.cnblogs.com/yjq520/p/7681537.html
- 集合-LinkedList
List linkedlist = new LinkedList<>(); LinkedList 底层数据结构是链表. 1. LinkedList 除了实现了List接口外,还实现了双向链 ...
- canves绘制北京地铁线路图,包括线路绘制,优先路线,单路径选择。
canves绘制北京地铁线路图,包括线路绘制,优先路线,单路径选择. 即将推出,后台涵盖各种语言,php,C#,java,nodejs等.
- C#代码处理前台html标签拼接
之前一篇文章是写,JavaScript处理特殊字符拼接时截断问题.最近在处理公司老软件兼容性升级时碰到的一个类似的问题,这次是后台拼接字符串,前台.aspx页面显示的.中间走了两次弯路,在此记录一下. ...
- c#基础之异常处理
在开发过程中,经常遇到各种各样的小问题,很多是由于基础不牢固,没有经常总结导致的.遇到重复的问题可能可根据以往经验处理,但是对问题本身引发的原因进行深入的了解.工作很多年,但是c#基础像一层冰一样,可 ...
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决办法
♦ 未在 Java构建路径中 找到父类 "javax.servlet.http.HttpServlet" ♦ 解决办法: 项目右击 → Build Path → 右侧 Add L ...
- 028_shell脚本递归求值
一. #!/bin/sh factorial() { if [ "$1" -gt "1" ]; then i=`expr $1 - 1` j=`factoria ...
- FS G729转码测试记录
默认情况下Freeswitch自带的G729模块是pass-through-并不支持转码.我们决定添加一个支持G729转码的模块到Freeswitch.参考自 8000HZ. 一.安装支持转码的G72 ...