14年12月CCF真题4-最优灌溉

问题描述

  雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口
很深的水井,所有的麦田都从这口井来引水灌溉。
  为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用
部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被
灌溉,则与其连接的麦田也能被灌溉。

现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用 (注意不是所有麦田之间都可以建立水渠)。请问灌溉所有麦田最少需要多少 费用来修建水渠。
输入格式

输入的第一行包含两个正整数n, m,分别表示麦田的片数和雷雷可以建立
的水渠的数量。麦田使用1, 2, 3, ......依次标号。

接下来m行,每行包含三个整数ai, bi, ci,表示第ai片麦田与第bi片麦田之
间可以建立一条水渠,所需要的费用为ci。
输出格式

输出一行,包含一个整数,表示灌溉所有麦田所需要的最小费用。

输入样例

4 4

1 2 1

2 3 4

2 4 2

3 4 3

输出样例

6

样例说明

建立以下三条水渠:麦田 1 与麦田 2、麦田 2 与麦田 4、麦田 4 与麦田 3。 评测用例规模与约定

前 20%的评测用例满足:n≤5。
前 40%的评测用例满足:n≤20。
前 60%的评测用例满足:n≤100。
所有评测用例都满足:1≤n≤1000,1≤m≤100,000,1≤ci≤10,000。

对最小生成树的考察,我用的prim算法。

#include <iostream>
#include <vector>
#include <math.h>
#include <map>

using namespace std;

int main() {
    map<pair<int,int>,int> line;     //储存边,key是相连两田,value是费用
    map<int,int> net;     //定义已连通的网
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++)     //输入数据
    {
        int a,b,c;
        cin>>a>>b>>c;
        line.insert(pair<pair<int,int>,int>(pair<int,int>(a,b),c));
    }
    net[1]=0;     //已连通网里添加田1
    int ans=0;
    while(net.size()<n){     //若已连通网里没有全部田
        int min=10001;     //定义最小值
        int field=1;     //定义要添加的田
        for(map<pair<int,int>,int>::iterator it = line.begin();it!=line.end();it++)
        {     //迭代搜寻与已添加的节点(田)连接的所具有最小的费用的点
            int a = it->first.first;
            int b = it->first.second;
            if((net.find(a)!=net.end() && net.find(b)==net.end())     //新点不应在net里的判断
                    || (net.find(a)==net.end() && net.find(b)!=net.end()))
            {
                int temp = it->second;
                if(temp<min)     //更新最小值
                {
                    min=temp;
                    if(net.find(a)==net.end())
                        field=a;
                    if(net.find(b)==net.end())
                        field=b;
                }
            }
        }
        net[field]=0;     //添加新点(田)
        ans+=min;     //更新总费用
    }
    cout<<ans;
    return 0;
}

时间: 2024-10-21 07:07:42

14年12月CCF真题4-最优灌溉的相关文章

14年12月CCF真题2-Z字形扫描

问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1539 3756 9464 7313 对其进行Z字形扫描后得到长度为16的序列: 1539739547366413 请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行 Z字形扫描的结果. 输入格式 输入的第一行包含一个整数n,表示矩阵的大小. 输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给

14年12月CCF真题1-门禁系统

问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每 位读者有一个编号,每条记录用读者的编号来表示.给出读者的来访记录,请 问每一条记录中的读者是第几次出现. 输入格式 输入的第一行包含一个整数n,表示涛涛的记录条数. 第二行包含n个整数,依次表示涛涛的记录中每位读者的编号. 输出格式 输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号 是第几次出现. 输入样例 5 12113 输出样例 11231 评测用例规模与约定 1≤n≤1,000,读者的编号为不超过

14年12月CCF真题5-货物调度

问题描述 某公司要处理一个周期性的物流问题. 有n个城市,第i个城市在每周的第j(1≤j≤7) 天会生产aij吨某种货物,同时 需要消耗bij吨该种货物.已知每周的产量等于消耗量(即aij之和等于bij之和). 城市之间有m条道路,第k条道路连接了城市sk和tk.一条道路上运输1吨 货物有一个固定的成本ck.道路都可以双向使用.每天运输的货物量没有限制.城市之间的距离并不远,货物可以从任意一个城市运输到任意另一个城市并且在当天到达. 货物如果在当天没有被消耗掉,就需要存放在仓库里过夜.第i个城市

14年12月CCF真题3-集合竞价

问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特 定股票的开盘价和开盘成交量. 该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种: 1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s. 2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s. 3. cancel i表示撤销第i行的记录. 如果开盘价为p0,则系统可以将所有出价至少为p0的买单和所有出价至多 为p0的卖单进行匹配.因此,此时的开盘成交量为出价至少为p

CCF真题之最优灌溉

201412-4 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉. 现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用(注意不是所有麦田之间都可以建立水渠).请问灌溉所有麦田最少需要多少费用来修建水渠. 输入格式 输入的第一行包含两个正整数n, m,

15年3月CCF真题3-节日

问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期. 提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年.例如1900年就不是闰年,而2000年是闰年. 为了方便你推算,已知1850年1月1日是星期二.

15年3月CCF真题2-数字排序

问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输入格式 输入的第一行包含一个整数n,表示给定数字的个数. 第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数. 输出格式 输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数.按出现次数递减的顺序输出.如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的. 样例输入 12 5 2 3 3 1 3 4 2 5 2 3 5 样例输出 3 4 2 3 5 3 1 1 4 1 评

15年3月CCF真题4-网络延时

问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为1.其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1.所有的终端电脑都直接连接到交换机上. 当信息在电脑.交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机.请问,电脑与电脑之间传递消息.或者电脑与交换机之间传递消息.或者交换机与交换机之间传递消息最多需要多少步. 输入格式 输入的第一行包

15年3月CCF真题1-图像旋转

问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数. 接下来n行每行包含m个整数,表示输入的图像. 输出格式 输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵. 样例输入 2 3 1 5 3 3 2 4 样例输出 3 4 5 2 1 3 评测用例规模与约定 1 ≤ n, m ≤ 1,00