hdu 1827 Summer Holiday 强连通分量缩点

2023-11-11

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1827

题意:听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话费了。他知道其他人也有一些别人的联系方式,这样他可以通知其他人,再让其他人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到吗? 

思路:把关系抽象成图,人看作点,强连通分量分解。同一个强连通分量内的点,可以互相通知,那么处理出每个强连通分量内的最小花费。然后缩点,记录每个点的入度,对于入度不为0的点,可以由其他点通知,对于入度为0的点,必须由lcy去通知。于是,lcy需要通知的最小人数就是入度为0的点数,最小花费就是这些点代表的强连通分量内的最小花费。

总结:刚开始以为缩点后还要拓扑排序找出入度不为0的点,后来发现直接统计就好了,汗...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

const int N = 1010;
struct edge
{
    int to, next;
} G[N*10];
int dfn[N], low[N], scc[N], st[N];
int head[N];
bool vis[N];
int index, cnt, num, top;
int scccost[N], indegree[N];
int n, m;

void init()
{
    memset(head, -1, sizeof head);
    memset(dfn, -1, sizeof dfn);
    memset(vis, 0, sizeof vis);
    index = cnt = num = top = 0;
}
void add_edge(int v, int u)
{
    G[cnt].to = u;
    G[cnt].next = head[v];
    head[v] = cnt++;
}
void tarjan(int v)
{
    dfn[v] = low[v] = index++;
    st[top++] = v;
    vis[v] = true;
    int u;
    for(int i = head[v]; i != -1; i = G[i].next)
    {
        u = G[i].to;
        if(dfn[u] == -1)
        {
            tarjan(u);
            low[v] = min(low[v], low[u]);
        }
        else if(vis[u])
            low[v] = min(low[v], dfn[u]);
    }
    if(dfn[v] == low[v])
    {
        num++;
        do
        {
            u = st[--top];
            scc[u] = num;
            vis[u] = false;
        }
        while(u != v);
    }
}

void shrinkage_point() /*缩点,统计各点的入度*/
{
    memset(indegree, 0, sizeof indegree);
    for(int i = 1; i <= n; i++)
        for(int j = head[i]; j != -1; j = G[j].next)
            if(scc[i] != scc[G[j].to])
                indegree[scc[G[j].to]]++;

    int res = 0, a = 0;
    for(int i = 1; i <= num; i++)
        if(indegree[i] == 0)
            res += scccost[i], a++;
    printf("%d %d\n", a, res);
}

int main()
{
    int a, b;
    int cost[N];
    while(~ scanf("%d%d", &n, &m))
    {
        init();
        for(int i = 1; i <= n; i++)
            scanf("%d", cost + i);
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d", &a, &b);
            add_edge(a, b);
        }
        for(int i = 1; i <= n; i++)
            if(dfn[i] == -1)
                tarjan(i);

        memset(scccost, 0x3f, sizeof scccost);
        for(int i = 1; i <= n; i++) /*统计出每个强连通分量内的最小花费*/
            scccost[scc[i]] = min(scccost[scc[i]], cost[i]);
        shrinkage_point();
    }
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 1827 Summer Holiday 强连通分量缩点 的相关文章

  • 字符串、字符数组的截取函数:strncpy、strsub

    字符数组的截取函数 字符串截取函数
  • 已知年月日利用公式求星期几模板

    在本文中 我们将使用C语言实现基于已知的年月日计算星期几的公式 这个公式被称为 蔡勒公式 Zeller s Congruence 是一种快速求解星期几的方法 代码分析 首先 我们需要对月份进行调整 如果月份小于3 即1月或2月 则将其视为上
  • 数论——欧拉函数

    在数论中 对正整数n 欧拉函数是少于或等于n的数中与n互质的数的数目 此函数以其首名研究者欧拉命名 它又称为Euler s totient function 函数 欧拉商数等 例如 8 4 因为1 3 5 7均和8互质 百度百科词条 欧拉函
  • 【刷题】华为笔试面试机考 [HJ5] - 进制转换

    题目地址 点击跳转 题目描述 写出一个程序 接受一个十六进制的数 输出该数值的十进制表示 输入描述 输入一个十六进制的数值字符串 注意 一个用例会同时有多组输入数据 请参考帖子https www nowcoder com discuss 2
  • 鸽巢原理(初识)(纯算法)

    http www docin com p 1352185354 html 一 什么是 鸽巢原理 抽屉原理 若把n个物体放在n 1个抽屉中 至少有一个抽屉中放了两个物体 二 特点 只能用于解决存在性问题 三 例题 例一 在边长为1的三角形放5
  • hdu 1069 Monkey and Banana

    Problem acm hdu edu cn showproblem php pid 1069 Reference www cnblogs com kuangbin archive 2011 08 04 2127291 html 题意 给
  • 算术表达式的前缀式、中缀式、后缀式相互转换

    中缀表达式 中缀记法 中缀表达式是一种通用的算术或逻辑公式表示方法 操作符以中缀形式处于操作数的中间 中缀表达式是人们常用的算术表示方法 虽然人的大脑很容易理解与分析中缀表达式 但对计算机来说中缀表达式却是很复杂的 因此计算表达式的值时 通
  • JAVA高精度乘法模板(大数乘以一个小数)

    1 思路 高精度乘法是大数乘以一个int型的小数 和前面模拟不同 这里不是一位一位的乘 而是a一位乘以整个数b 当a乘到最高位且没有进位就结束了 2 代码模板 方法一 a为大数 倒序存储 b为int型 返回a b的结果 public sta
  • HDU 1042 N!大数乘法

    N Time Limit 10000 5000ms Java Other Memory Limit 262144 262144K Java Other Total Submission s 69 Accepted Submission s
  • 二叉搜索树(树状数组)

    计数函数 程序 int lowbit int k return k k 功能 可视为每个节点的编号函数 加和函数 程序 int sum int x int ret 0 while x gt 0 ret c x x lowbit x retu
  • Buncket Sort桶排序(c++)实现代码

    代码原理我就不说了 参考 算法导论 原书第三版 p112 直接上代码会不会很爽 ConsoleApplication1 cpp 定义控制台应用程序的入口点 This programme is designed to show the Bun
  • HDU1085 Holding Bin-Laden Captive!

    Problem Description We all know that Bin Laden is a notorious terrorist and he has disappeared for a long time But recen
  • HDU1007(最近点对问题)

    题意不难理解 就是找到最近的两个点 计算其距离 除以2就是所求的圆的半径 思路很简单 运用分治的思想 先划分区间 分别找到左右区间中的最近点对 再合并区间 找到区间间的最近点对 注意如果用qsort 进行排序可能会超时 include
  • Codeforces-1454E Number of Simple Paths(基环树-思维)

    题目大意 给你n个点 n条边 求图中简单路径的个数 题目思路 n个点n条边 那么图中一定有一个环 拿这个图来讲 我们将两点间的关系分为4种 1 两点都在环上 简单路径的个数为2 例如2与5 2 一个点在环上一个点不在环上 简单路径个数为2
  • hduoj 2002

    计算球体积 Problem Description 根据输入的半径值 计算球的体积 Input 输入数据有多组 每组占一行 每行包括一个实数 表示球的半径 Output 输出对应的球的体积 对于每组输入数据 输出一行 计算结果保留三位小数
  • 回溯--深度优先搜索(图的M着色问题 poj1129)

    回溯 图的m着色问题 题目描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中相邻的两个顶点有不同的颜色 这个问题是图的m可着色判定问题 若一个图最少需要m种颜色才能使图
  • hdu 3966 Aragorn's Story

    Problem acm hdu edu cn showproblem php pid 3966 Reference 树链剖分 树链剖分原理 树链剖分详解及模板 HDU3966 树链剖分 Meaning 一棵 n 个点的树 每给结点有个值 三
  • GYM-102920-L. Two Buildings(决策单调性+分治)

    题目链接 题目大意 求一段序列的 h i h j j i 的最大值 step1 转化一下题意 h i h j j i h j h i j i 令a i h i b i h i 然后全部转化为两种坐标 i a i i b i 这样题目就转化成
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • 杭电ACM 1004题

    原题大概意思就是统计输入字符串中 重复的最大个数 import java util Scanner public class Main public static void main String args Scanner sc new S

随机推荐

  • windows 使用 wget——Wget for windows

    wget是一个强力方便的命令行下的下载工具 windows 如果使用需要安装 Wget for windows 地址 Link 下载压缩包 ZIP 解压到一个常用的安装位置 然后按照下面的步骤 配置环境变量 系统属性 此电脑右击选择属性 左
  • Vim安装配置和常用技巧

    第一章 安装 在命令行运行vim 如果找不到程序 需要自己安装 1 1 下载 从官方网站ftp ftp vim org pub vim unix 中选择一个版本下载 我这里使用的是vim 7 3 tar bz2 1 2 解压程序 tar x
  • 如何用js动态添加css

    转自 微点阅读 https www weidianyuedu com 为了节省代码和写出更兼容的代码 有时我们需要用Javascript动态的增加CSS样式 IE下 我们可以使用 document createStyleSheet 方法 而
  • C/C++实现strstr函数、KMP算法查找子串

    C C 实现strstr KMP算法查找子串 目录 C C 实现strstr KMP算法查找子串 1 字符串形式 2 字节流形式 1 字符串形式 代码实现 char my strstr const char src const char d
  • 反射改进简单工厂(含代码)

    一 简单工厂代码 父类Car public class Car public void CreateCar 子类ElectricityCar public class ElectricityCar extends Car Override
  • 使用mysql数据库与go进行交互

    database sql database sql是golang的标准库之一 它提供了一系列接口方法 用于访问关系数据库 它并不会提供数据库特有的方法 那些特有的方法交给数据库驱动去实现 database sql库提供了一些type 这些类
  • 线性代数(2)——矩阵

  • [完]机器学习实战 第十四章 利用SVD简化数据

    本章内容 SVD矩阵分解 推荐引擎 利用SVD提升推荐引擎的性能 餐馆可分为很多类别 不同的专家对其分类可能有不同依据 实际中 我们可以忘掉专家 从数据着手 可对记录用户关于餐馆观点的数据进行处理 并从中提取出其背后的因素 这些因素可能会与
  • 快速排序算法 (c/c++)

    快速排序 QuickSort Code 1 中间元素为基准 Code 1示例结果 Code 2 第一元素为基准 Code 2示例结果 算法分析 QuickSort 通过一趟排序将要排序的数据分隔成独立的两部分 其中一部分的所有数据都要比另一
  • Mental ray 渲染器常用设置

    Mental ray 渲染器常用设置 Mental ray是一个专业的3D渲染引擎 它可以生成令人难以置信的高质量真实感图象 现在你可以在3D Studio的高性能网络渲染中直接控制Mental ray 它在电影领域得到了广泛的应用和认可
  • 用python怎样做学生管理系统用类的形式-Python配置管理的几种方式

    一 为什么要使用配置 如果我们在较复杂的项目中不使用配置文件 我们可能会面临下面的情况 你决定更改你的项目中数据库的 host 因为你要将项目从测试环境转移到实际的上产环境中 如果你的项目中多个位置用到了这个 host 那你不得不一个一个找
  • CS336视觉伺服

    笔记 动力学模型 机械臂动力学的研究方法 拉格朗日 牛顿 欧拉 高斯 凯恩方法 机械臂的动力学主要是两个问题 正向运动学和逆向运动学 视觉伺服 视觉伺服的基本思想 基于视觉的伺服控制方法的目的是最小化一个图像误差 该误差可以定义为 e t
  • Elasticsearch搜索系统线上部署配置规划

    问题导读 1 es安装包的目录结构是怎样的 2 zen discovery集群发现机制的设置规划及其原理是怎样的 3 es默认参数调优如何进行 1 ES部署须知1 1 包结构es安装包的目录结构大致如下 bin 存放es的一些可执行脚本 比
  • Python数据分析之股票数据

    最近股市比较火 我7月初上车了 现在已经下了 中间虽然吃了点肉 但下车的时候都亏进去了 最后连点汤都没喝着 这篇文章我们就用python对股票数据做个简单的分析 数据集是从1999年到2016年上海证券交易所的1095只股票 共1000个文
  • C++实现——排序算法总结

    常见的排序算法有 直接插入 希尔 冒泡 快速 选择 堆排序 归并 基数 下面一一分析 并实现 1 冒泡排序 冒泡排序是最简单的排序算法 冒泡排序的基本思想是从后往前 或从前往后 两两比较相邻元素的值 若为逆序 则交换它们 直到序列比较完毕
  • R语言做面板VAR例子

    面板VAR步骤 1 对各变量做平稳性检验 IPS PP ADF LLC等方法检验 是逐个变量检验 还是一起检验 2 面板数据的最优滞后阶数确定 AIC和SIC方法 3 在PVAR系统中进行Wald Granger检验 4 面板VAR估计 5
  • 蓝桥试题 算法训练 阶乘末尾0的个数(C++)

    资源限制 时间限制 1 0s 内存限制 256 0MB 题目 n 表示为n的阶乘 其中阶乘的定义是这样的 若n为0 则有n 0 1 若n为正整数 则有n n 1 n 例如4 4 3 2 1 24 可以发现阶乘这一运算的数值增长速度是非常快的
  • SpringFramework历史版本

    SpringFramework历史版本 对于Spring而言 迄今已有14年历史了 版本也到达了5 0 作为JavaWEB开发领域的常青树 现在Spirng已不再简单是一个框架了 在Spring的项目中主要有 SpringFramework
  • qt Example Manifest Files

    manifest file 是有qdoc根据example对应的 qdocconf qdoc文件生成的 主要用于在qtcreator 的欢迎 welcome gt 示例 examples 中辅助显示内容项 其文件格式为xml格式 后缀名为
  • hdu 1827 Summer Holiday 强连通分量缩点

    题目 http acm hdu edu cn showproblem php pid 1827 题意 听说lcy帮大家预定了新马泰7日游 Wiskey真是高兴的夜不能寐啊 他想着得快点把这消息告诉大家 虽然他手上有所有人的联系方式 但是一个