题目大意

有一个n个点的完全图,上面有m条边的权值为1,其余为0

求MST

n,m<=10^5

题解

方法一:

维护一个点集,表示当前MST中的点

一开始任意加一个点

对于一个未加入的点,如果和点集中的点的1边数<点集大小,那么必定有0边

所以用堆维护与点集中点有1边的条数的点,每次取出度数最小的

重点:c++的堆的比较函数不太一样

如果一个点的度数=点集大小,答案+1

之后把这个点加进点集(即覆盖其余的点)

方法二:

暴力bfs,用set维护剩余未加入的点

如果用一个点取扩展其余的点,每个点会被0边覆盖一次,每条1边也只会被找到一次

所以时间是O((n+m)log)的

code

方法一

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define max(a,b) (a>b?a:b)
using namespace std; struct type{
int s,x;
friend bool operator < (type a,type b) {return a.s>b.s;}
};
priority_queue<type> heap;
int a[200002][2];
int ls[100001];
int b[100001];
int d[100001];
int bz[100001];
int n,m,i,j,k,l,len,ans; void New(int x,int y)
{
++len;
a[len][0]=y;
a[len][1]=ls[x];
ls[x]=len;
} int main()
{
// freopen("b.in","r",stdin); len=1;
scanf("%d%d",&n,&m);ans=n;
fo(i,1,m)
{
scanf("%d%d",&j,&k); New(j,k);
New(k,j);
} fo(i,1,n)
heap.push(type{0,i}); ans=0;
fo(l,0,n-1)
{
if (heap.top().s==l)
++ans; i=heap.top().x;
bz[i]=1;
heap.pop(); for (j=ls[i]; j; j=a[j][1])
if (!bz[a[j][0]])
{
++d[a[j][0]];
heap.push(type{d[a[j][0]],a[j][0]});
} while (!heap.empty() && heap.top().s<d[heap.top().x])
heap.pop();
} printf("%d\n",ans-1);
}

CF1242B. 0-1 MST的更多相关文章

  1. poj 1679 The Unique MST【次小生成树】

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24034   Accepted: 8535 D ...

  2. HDU4081 Qin Shi Huang's National Road System 2017-05-10 23:16 41人阅读 评论(0) 收藏

    Qin Shi Huang's National Road System                                                                 ...

  3. Prim 最小生成树算法

    Prim 算法是一种解决最小生成树问题(Minimum Spanning Tree)的算法.和 Kruskal 算法类似,Prim 算法的设计也是基于贪心算法(Greedy algorithm). P ...

  4. Docker ntpdate Permition error

    After building a Dockerfile, I run it. I figure out that there is something wrong with local time. S ...

  5. prim算法java版

    public class Prim { static int MAX = 65535; public static void prim(int[][] graph, int n){ char[] c ...

  6. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  7. POJ 2728 Desert King 01分数规划,最优比率生成树

    一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...

  8. c/c++ 用普利姆(prim)算法构造最小生成树

    c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: ​ 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时 ...

  9. Codeforces Round #535 (Div. 3) 解题报告

    CF1108A. Two distinct points 做法:模拟 如果两者左端点重合就第二条的左端点++就好,然后输出左端点 #include <bits/stdc++.h> usin ...

随机推荐

  1. 【漏洞学习】slowHTTPtest 慢速 DOS 攻击方法 修复方案

    日期:2018-05-28 21:41:59 更新:2019-07-05 23:15:21 作者:Bay0net 介绍:学习一下 slowHTTPtest 的攻击及防御. 0x01. 安装 下载链接 ...

  2. PHP 对Memcache的使用实例

    <?php //连接Memcache$mem = new Memcache;$mem->connect("localhost", 11211) or die (&quo ...

  3. LeetCode链表简单题

    一.21合并两个有序链表 代码如下: class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNod ...

  4. Python示例-Logging

    logging.ini日志配置文件内容示例: [loggers] keys=root,demo [handlers] keys=consoleHandler,timedRotatingFileHand ...

  5. 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁

    重入锁 Java中的重入锁(即ReentrantLock)   与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...

  6. 初涉Java

    一.学习内容总结 1.程序入口 但如果类的定义使用了public class声明,那么文件名必须与类名保持一致,使用了class定义的类,文件名称可以和类名称不同. 2.输出语句 3.print与pr ...

  7. MySQL-快速入门(1)基本数据库、表操作语句

    1.创建数据库 create database db_name;show create database db_name\G; //查看数据创建语句show databases; //查看当前创建的数 ...

  8. codeforces 597 div 2

    A 题意: 有无限个方块,上面分别是0,1,2......若方块i可以被表示为ax+by(x,y>0),则方块为白色,否则为黑色,给出a,b.问黑方块是否有无限个. 分析: 1:若(a,b)=1 ...

  9. RabbitMq学习1-介绍、安装和配置

    一.简介 1.MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka,以及阿里开源的RocketMQ       2.AMQP是消息队列的一个协议. 3.Rabbi ...

  10. Print out Android kernel log

    adb shell "su -c 'cat /proc/kmsg'" | tee kernel.log adb shell cat /proc/last_kmsg > las ...