/*
本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我们就可以认为不存在最小树形图。关于输出最小根也挺简单,在找最小入弧时,如果这条弧的起点是虚拟根,那么这条弧的终点就是要求的根。
*/
#include <cstdio>
#include <iostream>
#include<queue>
#include<set>
#include<ctime>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
const double eps=1e-10;
#define M 1009
#define type __int64
const type inf=(1LL)<<60;
struct point
{
int x,y,h;
}p[M];
struct Node{
int u , v;
type cost;
}E[M*M+5];
int pre[M],ID[M],vis[M];
type In[M],sum;
int n,m,ansi;
type Directed_MST(int root,int NV,int NE) {
type ret = 0;
while(true) {
//1.找最小入边
for(int i=0;i<NV;i++) In[i] = inf;
for(int i=0;i<NE;i++){
int u = E[i].u;
int v = E[i].v;
if(E[i].cost < In[v] && u != v) {
pre[v] = u;
if(u==root)//记录是root从哪一条边到有效点的(这个点就是实际的起点)
ansi=i;
In[v] = E[i].cost;
}
}
for(int i=0;i<NV;i++) {
if(i == root) continue;
if(In[i] == inf) return -1;//除了跟以外有点没有入边,则根无法到达它
}
//2.找环
int cntnode = 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];
}
if(v != root && ID[v] == -1) {
for(int u = pre[v] ; u != v ; u = pre[u]) {
ID[u] = cntnode;
}
ID[v] = cntnode ++;
}
}
if(cntnode == 0) break;//无环
for(int i=0;i<NV;i++) if(ID[i] == -1) {
ID[i] = cntnode ++;
}
//3.缩点,重新标记
for(int i=0;i<NE;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].cost -= In[v];
}
}
NV = cntnode;
root = ID[root];
}
return ret;
}
int main()
{
int u,v;
type w;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%I64d",&u,&v,&w);
u++;
v++;
E[i].u=u;
E[i].v=v;
E[i].cost=w;
sum+=w;
}
sum++;
for(int i=m;i<m+n;i++)//第i条边的终点为i-m;
{
E[i].u=0;
E[i].v=i-m+1;
E[i].cost=sum;
}
type ans=Directed_MST(0,n+1,m+n);
if(ans==-1||ans-sum>=sum)//最小树形图的边权和值大于sum的两倍,说明不可能构成最小树形图,因为必定存在两条从虚拟点出发的边
puts("impossible");
else
{ printf("%I64d %d\n",ans-sum,ansi-m);//利用i>=m时,第i条边的终点为i-m;这里不能替换为E[ansi].v-1;因为E[i]在朱刘算法过程中节点信息会变化。
}
puts("");
}
return 0;
}相关推荐
python操作git推送自己分支并合并主分支(持续优化该工具)
python git
HDU2121(最小树形图的模版算法题)
这个道题也是在看了大神之后敲的,我也是刚刚学习这个 ^ _ ^,看来离大佬们的距离还是太远了:以下内容也是在学习大佬讲解的内容之后,根据大佬们的详细讲解中总结出来的! 贪心算法。可以想到每次都找每个点的入边中最小的一个来构成树,如果构成了,就是最小的。但是构成过程中可能会出现环,这时候就需要缩点。 而且因为每个点只选取一条入边,所以构成的环一定是简单环。 每次找到环以后需要更新权值,规则是这样的: 对于每条指向环的边,该边边权减去所指向点的最小入边。更新后继续找环,直到没有环即找到最小树形图。时间复杂度 O
ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS
在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。
hdu 2121 最小树形图 +虚根
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意: n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍所有的城市,同时使总权值最小。如果找不到就输出impossible,能的话输出最小权值和这个节点的编号。 做法: 最小树形图虚根的第一道题,因为不能确...
Cadence17.2 > OrCAD Capture CIS > 设计规则检查(Design Rule Check)DRC学习记录详解
选中设计完成的DSN文件,选择Tool->Design Rule Check,弹出下面对话框,详解如下。 一、Design Rule Check对话框选项详解 Design Rules Options tab Set the scope, mode and type of design rule (electrical and / or physical) test options for the design rules check. 为
【数据分享】中国371个城市的坡度矢量数据和excel数据
在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。
hdu2121 最小树形图 (无根)
加入一个虚点 往每条边放入INF 这样的话 最多只有一条边会与他 相连 只需要记录一下第几个点是和虚点相连即可 注意!不查重比较简便! #include<iostream> #include<cstring> #define INF 0x3f3f3f3f using namespace std; const int N = 1100,M = 11000 + N; struct node{ int x,y,w; }a[M]; int dis[N][N]; int n,m
K-L展开 (Karhunen-Loeve expansion)
K-L变换
HDU -- 2121 【无定根的最小树形图】
传送门题意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费 思路: 1:构造虚根最小树形图 因为是不定根,所以我们可以假设一个虚拟根,分别与n个点都有一条权值为r的虚边,假如我们把r设的非常大的话,我们求出来的值就可以判一下选了几条虚边, 如果有两条以上, 则这个图原来是不连通的.2:不含虚拟点的最小树形图的根节点 因为在缩点的时候我们需要给每一个点进行从
QGis软件 —— 1、Windows10下载安装QGis及插件
QGis —— 1、Windows10下载安装QGis及插件
学Simulink--进阶电机控制场景实例:基于Simulink的异步电机定子磁链定向控制(SFOC)仿真
本文详细介绍了基于Simulink的异步电机定子磁链定向控制(SFOC)仿真实现方法。主要内容包括:1) SFOC原理分析,突出其对转子参数不敏感的优势;2) 工业风机驱动系统的完整建模流程,涵盖主电路搭建、坐标变换、磁链观测器设计等关键步骤;3) 核心模块代码实现,包括电压模型磁链观测器和双闭环PI控制器;4) 仿真结果验证了SFOC在转速响应(0.2s)、转矩恢复(0.15s)和参数鲁棒性(转子电阻变化50%时转速波动<2%)方面的优异性能。本文为工程师提供了实用的SFOC系统开发指南,特别适用于
HDU 2121 Ice_cream’s world II 无固定点的最小树形图 朱刘算法
/* 本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我
基于Simulink的电动车PMSM能量泄放与回收系统仿真设计
摘要 本文设计了一个基于Simulink的电动车PMSM能量泄放与回收系统仿真模型。系统采用分层建模方案,包含永磁同步电机(PMSM)矢量控制、电池管理和泄放功率计算等核心模块。通过详细的参数计算和MATLAB脚本实现,模拟了电动车在制动时的能量回收过程。重点研究了泄放电阻的控制策略,提出基于母线电压和电池SOC的多目标优化算法,确保系统在保护硬件安全的同时最大化能量回收效率。仿真模型包含完整的数学推导和模块搭建指南,为电动车能量管理系统设计提供了有效的仿真验证平台。
HDU 2121 Ice_cream’s world II(不定根最小树形图)
大概题意是找出一个点,以这个点为根的最小树形图权值和最小,输出最小树形图的权值以及点的编号。 不定根,所以我们要添加一个虚根...然后就是很多大牛说的方法了... 不过我一直很纳闷,我枚举每一个点为根求最小树形图..然后找出最小,这个一直WA,不明白为啥不是TLE,难道是模板问题?但是我的虚根是1或者n+1都是没问题,看起来不像是只能处理固定点的..求路过的大神解释一下.. #include
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
【转】【最小树形图】有向图的最小生成树【朱刘算法】
这篇文章挺好的。每行还有注释QAQ,kuangbin的模板里并没有万能节点; 万能节点好像是在不定根的时候的拓展。 要点: 1.求所有边权和sum; 2.以0点为万能节点向所有点建一条权值为sum的边; 3.记得sum++;保证比所有边权值总和大一点; 4.判断条件为(ans==-1||ans-sum>=sum) //ans-sum是除去虚根的最小树形图的最短路径,如果这个距...
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
最小树形图【有向图的最小生成树】
做了POJ的一道题,总是WA,不知道为什么,后来去看了,才知道,原来有向图的最小生成树与无向图不一样,它得是从某个点出发能遍历到其他所有点的才行,以此为条件,我们学习到了最小树形图。 与很多其他人的讲解不一样吧,我把我看了博客后自己的思路分享出来,关于什么是最小树形图。 我们知道的既然要建立最小树形图,就要理解什么是最小树形图,(概念好难懂啊,还是自己写的清楚明白),我们从某一点出...
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
HDU2121 Ice_cream’s world II【最小树形图】【不定根】
题目大意:一个国家有N个城市,M条有向道路,国王想要选一个城市为首都, 使得这个城市既能连接所有的城市,而且总的路程最短。若能找到这个城市,则 输出最短路程和城市编号。 思路:求有向图的最小树形图,不过根节点是不定的。虚拟一个根结点,到每个 结点都有一条边,其到每个结点的权值应该相等,表明每个结点都应该且都有机 会当根。且边的权值应比总权值大一些。如果最终算出的最小树形图的总权值大 于或等于 原图的总权值 + 虚根到实根(也就是原图的总权值),其实就是算出的最 小树形图的总权值大于或等于 原图总权值的二倍,
hdu 2121 无固定根的最小树形图
题目链接解析本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我们就可以认为不存在最小树形图。关于输出最小根也挺简单,在找最小入弧时,如果这条弧的起点是虚拟根,那么这条弧的终点就是
HDU-2121(朱刘算法优化版+虚根处理无根树形图)
hdu2121 #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1010; const int MAXM = 10005; struct Edge{ int u, v, cost; }edge[MAXM];//用链表存图比原始用矩阵快些 int ...
HDU2121 Ice_cream’s world II 【最小树形图】+【不定根】
Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2744 Accepted Submission(s): 630 Problem Description After
HDU 6141 最小树形图
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=6141 题意: N个点M条边求最大树形图,还问权值最大的图中第N个点的父亲编号最小能是多少 规模:N<=1e3,M<=1e4N <= 1e3, M <= 1e4 类型:最小树形图 边权处理 分析: 最开始做的时候用最小费用流,但会超时 原来是最小树形图 这里第N个点的边权,按其u的序号
hdu 2121
题意: 有向图的最小生成树(只管出去,不管回来) 标准的模板啊, 设置一个虚拟节点n 权值是max+1; 代码是对这别人的打的,第一次不会写!#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define N 1010 #define inf 101000000 struct edg {
hdu 2121 (不定根的最小树形图)
Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6285 Accepted Submission(s): 1636 Problem Description After awarde...
hdu2121
/* 分析: 无定根的最小树形图。 虚拟出一个root,到每个node都有一条边,其权值>整张map中的边的权值和。 至于这个题,当最小树形图的权值相等时,要选择node编号最小的city作为中心这 点,代码行45可以得到所需index,因为在找最小的in的时候,我们是按照边的编号从小 到大遍历的,且在加入虚拟root到city的边的时候,也是按照city编号的
Hdu 2121 Ice_cream’s world II 无根最小树形图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121
Ice_cream’s world II HDU - 2121 最小树形图
https://vjudge.net/contest/179107#problem/B参考https://vjudge.net/solution/3192331这个地方的超级源点很妙。。。int n,m,idx,maxx; int pre[mxn],id[mxn],vis[mxn],in[mxn],tot; struct edge{ int u,v,w; }e[mxe]; void add(
862



被折叠的 条评论
为什么被折叠?



