[POJ 1639] 单度限制最小生成树

【入门】寻找最大数和最小数的位置 【循环】 题目描述 Description 输入N个数,打印其中的最大数和最小数及其位置号,如果有相同数,输出最早出现的那一个.(0<N<10000) 输入 第一行一个数N.第二N个数,用空格隔开。 输出 输出一行,两个数,第一个数为最大数位置号,第二个数为最小数的位置号。 样例输入 7 3 2 7 6 4 5 7 样例输出 3 2 C源代码: #include<std... 阅读详情

题目大意:

 有一个公园,最多只能允许有K条路通向公园,问在这个限制条件下,所能形成的最小生成树。


资料:

IOI2004国家集训队论文--王汀《最小生成树问题的扩展》

http://wenku.baidu.com/view/41800d66ddccda38376bafac.html


度限制最小生成树的算法的关键是动态规划来实现更新每一个点到根节点的最大边。(具体实现见代码)


/*
ID: wuqi9395@126.com
PROG:
LANG: C++
度限制最小的生成树:
1. 去掉根节点,生成一个森林。
2. 将每个子树分别于根节点相连(取最小的边)。生成一个m度最小生成树
3. 迭代(k - m)次,每次连接一条没用过的与根节点相连的边,形成一个环,去掉其中不与根节点相连的边

在更新每一个点到根节点的最大值时,可以采用动态规划的算法 mx[v] = max(mx[pre[v]], edge[v][pre[v]])
复杂度 O(VlogV + k * n)
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define maxn 105
#define maxm 100005
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define For(i, n) for (int i = 0; i < n; i++)
typedef long long ll;
using namespace std;
int m, n, head[maxn], cnt, k, vis[maxn];
int cnt_block, ans, belong[maxn], pre[maxn], dis[maxn], use[maxn][maxn], link[maxn], point[maxn];
//cnt_block记录连通块的数量,belong[]记录每个点属于第几个连通分量, pre[]记录生成森林时的前驱, dis[]记录每个点到该连通分量根节点距离
//use[][]记录该条边是否使用,link[]记录每一连通分量到根节点的最小距离,point[]记录每个连通分量中与根节点相连的点
vector<int> block[maxn];
map<string, int> mp;
struct node {
   int v, w, next;
}g[maxm];
struct Edge {
    int u, v, w;
    Edge() {}
    Edge(int a, int b, int c) {
        u = a, v = b, w = c;
    }
    void init() { w = 0; }
    bool operator > (const Edge & a) const {
        return w > a.w;
    }
}mx[maxn];
int getId(char s[]) {
    if (mp.find(s) == mp.end()) mp[s] = ++n;
    else return mp[s];
    return n;
}
void addedge(int u, int v, int w) {
    g[cnt].v = v;
    g[cnt].w = w;
    g[cnt].next = head[u];
    head[u] = cnt++;
}
void dfs(int v) {    //将图分成若干连通块
    vis[v] = 1;
    belong[v] = cnt_block;
    block[cnt_block].push_back(v);
    for (int i = head[v]; i != -1; i = g[i].next)
        if (!vis[g[i].v]) dfs(g[i].v);
}
void prim(int cur) {
    dis[block[cur][0]] = 0;
    for (int i = 1; i <= block[cur].size(); i++) {
        int mn = INF, k = -1;
        for (int j = 0; j < block[cur].size(); j++) {
            int v = block[cur][j];
            if (pre[v] != -1 && dis[v] < mn) {
                mn = dis[v];
                k = v;
            }
        }
        if (k != -1) {
            ans += dis[k];
            use[pre[k]][k] = use[k][pre[k]] = 1;
            pre[k] = -1;
            for (int i = head[k]; i != -1; i = g[i].next) if (pre[g[i].v] != -1 && dis[g[i].v] > g[i].w) {
                dis[g[i].v] = g[i].w;
                pre[g[i].v] = k;
            }
        }
    }
}
void MdegreeMST() {
    mem(vis, 0);
    vis[1] = 1;
    cnt_block = 0, ans = 0;
    for (int i = 2; i <= n; i++) if (!vis[i]) {     //求有多少连通分量
        cnt_block++, block[cnt_block].clear();
        dfs(i);
    }

    pre[1] = -1;
    mem(use, 0); mem(pre, 0);
    for (int i = 1; i <= n; i++) dis[i] = link[i] = INF;    //生成最小森林
    for (int i = 1; i <= cnt_block; i++) prim(i);
    for (int i = head[1]; i != -1; i = g[i].next) if (link[belong[g[i].v]] > g[i].w) { //将森林生成一个M度树
        link[belong[g[i].v]] = g[i].w;
        point[belong[g[i].v]] = g[i].v;
    }
    for (int i = 1; i <= cnt_block; i++) {
        ans += link[i];
        use[1][point[i]] = use[point[i]][1] = 1;
    }
}
void getMax(int v, int fa, int w) {     //更新树上每一点到根节点的最大距离
    pre[v] = fa;
    Edge tmp(v, fa, w);
    if (tmp > mx[fa]) mx[v] = tmp;
    else mx[v] = mx[fa];
    for (int i = head[v]; i != -1; i = g[i].next) if (use[v][g[i].v] && g[i].v != fa)   //不能产生环路
        getMax(g[i].v, v, g[i].w);
}
void solve() {
    int degree = cnt_block;
    for (int i = 0; i <= n; i++) mx[i].init();
    getMax(1, 0, 0);    //从根节点出发更新每个点到根节点的最大边
    while (degree < k) {
        int mn = 0, pos = 0, w;
        for (int i = head[1]; i != -1; i = g[i].next) if (!use[1][g[i].v] && mx[g[i].v].w - g[i].w > mn) {
            mn = mx[g[i].v].w - g[i].w;
            pos = g[i].v, w = g[i].w;
        }
        if (!pos) break;
        ans -= mn;
        degree++;
        use[pos][1] = use[1][pos] = 1;
        use[mx[pos].u][mx[pos].v] = use[mx[pos].v][mx[pos].u] = 0;
        getMax(pos, 1, w);
    }
    printf("Total miles driven: %d\n", ans);
}
void init() {
    mem(head, -1);
    cnt = 0, n = 1;
    char s1[55], s2[55];
    scanf("%d", &m);
    mp.clear();
    mp["Park"] = 1;
    int w;
    for (int i = 0; i < m; i++) {
        scanf("%s%s%d", s1, s2, &w);
        int u = getId(s1), v = getId(s2);
        addedge(u, v, w);
        addedge(v, u, w);
    }
    scanf("%d", &k);
}
int main ()
{
    init();
    MdegreeMST();
    solve();
    return 0;
}



从仿真到实践:两级直接耦合放大电路的静态工作点协同调试指南 本文详细解析了两级直接耦合放大电路的静态工作点协同调试方法,从仿真到实践提供系统指南。重点介绍了Rc2电阻调整技巧、集电极电位测量方法及常见问题排查,帮助工程师解决各级静态工作点相互影响的难题,提升模拟电路设计效率。 阅读详情

相关推荐

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 498

k度限制最小生成树

//poj 1639 int g[N][N]; int clo[N],dis[N],pre[N]; int n,rt; int prim(int s,int id){ dis[s]=0; int ans=0; while(1){ int idx=-1,tmp=INF; for(int i=0;i<n;i++)if(!clo[i]&&dis[i

wen_xp的专栏 689

低速信号设计之 LPC 篇

摘要:LPC总线作为服务器低速信号设计的关键技术,在BIOS芯片连接、Super I/O芯片控制和嵌入式管理等方面发挥着重要作用。其采用33MHz时钟频率和4位并行传输机制,理论速率达16.5MB/s。设计时需重点关注布线长度(建议<10cm)、信号完整性(45°走线、合理层间隔离)和过孔优化等要点。典型应用案例表明,通过规范设计可确保在工业控制等复杂环境中稳定工作。LPC总线凭借低成本、低引脚数和良好兼容性,仍是服务器低速外设连接的重要解决方案。

qq_16237389的博客 1165

K度限制最小生成树

K度限制最小生成树 含义: 在最小生成树的基础上,限制了某一点v0的度最大为K (<=K) ,要求满足此条件的最小生成树。 求解方法: 先在删去点v0的基础上跑最小生成树。此时有可能生成M个最小生成树(连通块),那么v0的度就至少为M,因为v0必须与每个连通块相连才能最终生成一棵树。然后每棵树选择一个和v0相连权值最小的边,连接此边,生成M度最小生成树。 求出每个点到v0的最短路径上的权值最大的边dp[i]。 遍历与v0相连但不在树中的边edge[v0][v],假设连接其中一条边,则应删去该边对应的

Khasehemwy的博客 840

DMTF相关协议(一):Redfish和SMBIOS

Redfish 是一种管理标准,使用超媒体 RESTful 接口中的数据模型表示。该模型以标准的、机器可读的模式表示,消息的有效负载以 JSON 表示。该协议本身利用了 OData v4。由于它是一个超媒体 API,因此能够通过一致的接口表示各种实现。它具有管理数据中心资源、处理事件、长时间任务和发现的机制。

weixin_44032634的博客 2265

Eclipse邂逅Deepseek:本地化部署全攻略

通过前面一系列的步骤,我们成功地在 Eclipse 中完成了 Deepseek 的本地化部署,并且对部署后的功能进行了测试和优化,还解决了可能遇到的一些常见问题。这一过程不仅让我们体验到了将强大的大语言模型与高效的开发环境相结合的魅力,也为我们在软件开发过程中带来了诸多便利。本地化部署 Deepseek 到 Eclipse,使得我们在代码编写过程中能够获得智能的代码补全和精准的问答支持,大大提高了开发效率。同时,本地化部署保障了数据的安全性和隐私性,避免了数据在传输过程中可能面临的风险。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4521

最小度限制生成树(K度限制生成树)

例题 POJ 1639 Picnic Planning 求最小度生成树,实质上是将一个V0点的最小度生成树展开的过程。 首先,求的除了V0点以外的所有子树的最小生成树,并且知道每棵子树到V0的最小边,以及是由哪个点延展过去的,于是,我们首先可以确定最小度生成树,假设此时的度是cnt。(子树个数) 然后就是展开的过程,对于每棵子树,我们找到最优的展开点,而且,要知道对于所有的最优展开的点只...

既然弱小,就只顾变强就是了 1049

在 SAP BTP 中通过 MTA 自动创建 Service Broker 的原理与实战

本文探讨了如何在SAP BTP的Cloud Foundry环境中通过MTA部署自动创建和注册Service Broker。传统手动注册方式存在依赖管理员、环境一致性差等问题。通过MTA部署可实现自动化Broker注册,利用占位符生成安全凭证,并确保平台端与应用端认证一致。文章详细解析了关键配置参数,包括create-service-broker标志、Broker名称、认证凭据和访问URL的设置方法。这种基础设施即代码(IaC)方式能提升DevOps实践水平,使服务注册成为应用部署流水线的有机组成部分。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 201

基于visual Studio2013解决C语言竞赛题之0407最大值最小值

题目解决代码及点评这道题考察循环和比较/************************************************************************/ /* 7. 任意十个数,打印出它们中的最大数、最小数。 测试数据:① 1,-12,20,30,-5,-23,33,125,200,-100 ② 0,10,3,1,5,6,-10,90,9,-4 ...

weixin_30699465的博客 244

【制作100个unity游戏之22】3DRPG游戏开发07——其他详细的设计

我们会有有很多单例,如果每个单例都去写会很麻烦,所以我们定义泛型单例模式 Singleton,我们将所有的单例都继承这个泛型单例,就省略很多重复的工作定义一个GameManager类,继承Singleton,控制整个游戏的进度,比如如果主角死了,广播,游戏结束调用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2577

Sigrity Power DC Package Multi-Resistor Compact ET Model Extraction模式提取封装基板电热阻模型

DIE(定义DIE的参数):material设置为silicon(硅),Attach material(贴片的材料,设置为Die Attach),Attach thickness(贴片的材料的厚度,厚度设置为0.001mm,点击ok。Cap为覆盖材料,Material定义材料类型,thickness定义厚度,length和width定义长宽,Adhesive Material为胶的材料,Adhesive Material为胶的厚度,本例不定义,跳过即可。

weixin_54787054的博客 440

最小生成树-Prim 配题(HDU 1863)

最小生成树的Prim算法的思想和Dijkstra的算法思想是一致的,但是唯一的不同点在于,Dijkstra算法更新的是非选集合以外的点到达源点的最短路径,而Prim算法更新的是非选集合到选定集合的边的一条最短的权重边。 题目:HDU 1863(和克鲁斯卡尔算法的题目一致) #include<iostream> #include<cstring> #include&lt...

猫ER 488

ABAP BDC 处理踩坑笔记:把错误挡在录制之前,把稳定做进每一行 BDCDATA

本文总结了SAP BDC(批输入)开发中的常见问题和解决方案。重点包括:1)理解BDCDATA本质是模拟人工操作而非直接操作数据库;2)数据格式化技巧,如金额、日期、物料号等字段的标准化处理;3)通过CTU_PARAMS参数控制执行环境,确保屏幕尺寸和更新模式一致;4)不要依赖sy-subrc,应通过解析MESSTAB消息判断业务是否成功;5)录制阶段的常见陷阱及解决方法;6)疑难问题的系统性解决思路;7)建议建立完善的错误处理机制,包括日志记录和重跑功能。文章提供了实用的ABAP代码示例和配置建议,帮助开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 265

[POJ 3164] Command Network 有向图的最小树形图(朱刘算法)

Command Network

SIOFive的专栏 1845

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[POJ 3734] Blocks (矩阵快速幂、组合数学)

POJ 3734 Blocks 矩阵快速幂 组合数学

SIOFive的专栏 1829

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[POJ 1724] ROADS (有约束条件的最短路)

题目链接:

SIOFive的专栏 1707

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

POJ 1601 青蛙的约会

题意是给你两只青蛙,在一个首位相连的数轴上跳,问能否碰到。给出x,y,n,m,l。分别代表第一只所在位置,第二只所在位置,第一只每次跳的步数,第二只每次跳的步数,以及数轴总长度。 稍微化简一下可以发现有  x+m*t=k1*L+p; y+n*t=k2*L+p 得到(n-m)*t+l*(k2-k1)=x-y 可以发现,这是一个二元一次方程,而我们就是要求一对整数解,且(t 是大于0的最小解)

SIOFive的专栏 1686

[POJ 2728] 最优比例生成树

POJ 2728 最优比例生成树

SIOFive的专栏 1616

POJ 2396 Budget (有源汇有上下界的可行流)

POJ 2396 Budget  链接:http://poj.org/problem?id=2396 题意:给定一个M*N的矩阵,给定每行每列的和,以及其中一些值的限定条件,问能否构成一个可行的矩阵。 思路: 添加一个源点,向每行连边,每条边的上下界都为该行的和;添加一个汇点,每列向汇点连边,边的上下界都为该列的和。然后每行向每列连边,边的上下界一开始为(0,INF),之后

SIOFive的专栏 1613

[POJ 2585] Window Pains (拓扑排序)

Window Pains 题目链接:http://poj.org/problem?id=2585 题目大意: 有4*4的网格,其中有九个任务,在网格上的位置如下。 现在依次打开几个任务,在同一个网格上,前一个任务会覆盖掉后一个任务。给你一个网格,问你能否通过调整先后顺序,使得构成该网格。 1 1 . . 1 1 . . .

SIOFive的专栏 1458

POJ 1966 Cable TV Network(无向图的顶点连通度)

POJ 1966 Cable TV Network 链接:http://poj.org/problem?id=1966 题意:有线电视网络中,中继器的连接是双向的。如果网络中任何两个中继器之间至少有一条路,则中继器网络称为是连通的,否则中继器网络是不连通的。一个空的网络、以及只有一个中继器的网络被认为是连通的。具有n 个中继器的网络的安全系数f 被定义成: (1) f 为n,如果不管

SIOFive的专栏 1362

POJ 2778 DNA Sequence (AC自动机 + dp)

DNA Sequence 题意:DNA的序列由ACTG四个字母组成,现在给定m个不可行的序列。问随机构成的长度为n的序列中,有多少种序列是可行的(只要包含一个不可行序列便不可行)。个数很大,对100000取模。 思路:推荐一个博客,讲的非常清楚。 这种题目,n很大,首先想到的就是用矩阵来优化。那么如何构造转移方程呢:首先建立一棵Trie,然后按照AC自动机的方式构造fail指针,然后

SIOFive的专栏 1341

POJ 1679 The Unique MST (次小生成树)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17785   Accepted: 6176 Description Given a connected undirected graph, tell if its minimum spa

SIOFive的专栏 1314

[POJ 1128] Frame Stacking (拓扑排序)

拓扑排序的所有序列 POJ1128 Frame Stacking

SIOFive的专栏 1301

POJ 2112 Optimal Milking (二分 + floyd + 网络流)

POJ 2112 Optimal Milking  链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C≤200)头奶牛,在奶牛和挤奶器之间有一组不同长度的路。K个挤奶器的位置用1~K的编号标明,奶牛的位置用K+1~K+C 的编号标明。每台挤奶器每天最多能为M(1≤M≤15)头奶牛挤奶。寻

SIOFive的专栏 1274

[POJ 1985] Cow Marathon (树的直径)

题目链接:

SIOFive的专栏 1271
上一篇: [Codeforces 125E] MST Company (单度限制最小生成树)
下一篇: CF 189A DP
SIO__Five
博客等级 码龄14年 29粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值