zoukankan      html  css  js  c++  java
  • 安慰奶牛 蓝桥杯

    问题描述

    Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计 划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的 时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上 起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

    输入格式

    第1行包含两个整数N和P。

    接下来N行,每行包含一个整数Ci

    接下来P行,每行包含三个整数Sj, Ej和Lj

    输出格式
    输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。
    样例输入
    5 7
    10
    10
    20
    6
    30
    1 2 5
    2 3 5
    2 4 12
    3 4 17
    2 5 15
    3 5 6
    样例输出
    176
    数据规模与约定

    5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <iostream>
     5 using namespace std;
     6 const int inf = 1<<30;
     7 int point[111111];
     8 int pre[111111];
     9 int n,m,sum;
    10 struct node
    11 {
    12     int x,y,w;
    13 } e[111111];
    14 int cmp(node a,node b)
    15 {
    16     return a.w<b.w;
    17 }
    18 int find(int x)
    19 {
    20     if(pre[x]==x)
    21     return x;
    22     int t = find(pre[x]);
    23     pre[x] = t;
    24     return t;
    25 }
    26 int main()
    27 {
    28     int i,j,minn = inf;
    29     scanf("%d%d",&n,&m);
    30     for(i = 1; i<=n; i++)
    31     {
    32         scanf("%d",&point[i]);
    33         minn = min(minn,point[i]);//求最小的花费
    34         pre[i] = i;
    35     }
    36     for(i = 1; i<=m; i++)
    37     {
    38         scanf("%d %d %d",&e[i].x,&e[i].y,&e[i].w);
    39         e[i].w = 2*e[i].w+point[e[i].x]+point[e[i].y];
    40     }
    41     sort(e+1,e+m+1,cmp);//按照价值进行排序
    42     sum = 0;
    43    // for(int k=0;k<=m;k++)
    44         //cout<<e[k].x<<" "<<e[k].y<<" "<<e[k].w<<endl;
    45     for(i = 1;i<=m;i++)
    46     {
    47         int fx = find(e[i].x);
    48         int fy = find(e[i].y);
    49         if(fx!=fy)
    50         {
    51             sum+=e[i].w;
    52             pre[fx] = fy;
    53            // cout<<"EI"<<e[i].w<<" "<<sum<<endl;
    54         }
    55     }
    56     printf("%d
    ",sum+minn);
    57     return 0;
    58 }
  • 相关阅读:
    16-爬虫之scrapy框架手动请求发送实现全站数据爬取03
    15-爬虫之scrapy框架基于管道实现数据库备份02
    14-爬虫之scrapy框架的基本使用01
    13-爬虫之js加密,解密,混淆,逆向破解思路
    12-基于selenium实现12306模拟登录,及京东登录滑动缺口验证模拟登录
    11-selenium浏览器自动化
    10-异步爬虫(线程池/asyncio协程)实战案例
    09-百度ai图片识别
    08-百度ai语音合成
    RNN
  • 原文地址:https://www.cnblogs.com/lovychen/p/3603153.html
Copyright © 2011-2022 走看看