54.施工方案第二季(最小生成树)


时间限制: 1 s

 空间限制: 128000 KB

 题目等级 : 黄金 Gold

题解

 查看运行结果

题目描述 Description

c国边防军在边境某处的阵地是由n个地堡组成的。工兵连受命来到阵地要进行两期施工。

第一期的任务是挖掘暗道让所有地堡互联互通。现已勘测设计了m条互不相交的暗道挖掘方案,如果这m条暗道都实施挖掘,肯定能达到互联互通的目的。事实上,适当选择其中n-1个方案挖掘,就能实现互联互通,即从每个地堡出发都能到达其他任何一个地堡(允许经过别的地堡)。

连长精心谋算,在m个设计规划中选取了挖掘总距离最短且能保证互联互通的若干个暗道规划实施了挖掘,完成了第一期的施工任务后又接受了第二期的施工任务,要求选择一个地堡进行扩建改造,使其能向每个地堡提供弹药。为了让弹药供应更及时、更快捷,从改扩建的地堡到最远地堡的距离(称为最远输送距离)应当尽量小。

你的任务是先求出第一期施工挖掘的总距离,再求改扩建地堡最远输送距离的最小值。

输入描述 Input Description

其中第一行是n和m,m>=n
下面的m行每行3个数xi、yi、zi,表示xi到yi的距离是zi
  zi<1000000且m个距离互不相等

输出描述 Output Description

共包含两行,每行一个整数,
第一行是第一期的挖掘总距离,第二行是最远输送距离的最小值。

样例输入 Sample Input

4 5
1 2 1
2 3 2
3 4 3
4 1 4
3 1 5

样例输出 Sample Output

6
3

数据范围及提示 Data Size & Hint

【样例说明】
第一期挖掘1到2、2到3和3到4的3条暗道,第二期选择3号地堡进行改扩建,最远输送距离是3
【数据规模】
60%的数据 n<10且m<20
80%的数据 n<1000且m<2000
100%的数据 n<100000且m<200000

错误代码:(总距离正确)

#include

using namespace std;

#include

#include

#include

#include

#include

#define maxn 100000

#define maxm 200000

struct Edge{

       int u,v,next;

       long long w;

};

Edge edge[2*maxm];

long long tot=0;

int visit[maxn]={0},head[maxn],man[maxn];

int maxdis[maxn],n,m;

void input();

void prim();

int main()

{

       input();

       prim();

       printf("%lld\n",tot);

       for(int i=2;i<=n;++i)

       {

              if(maxdis[i]!=0&&maxdis[i]

               maxdis[1]=maxdis[i];

       }

       printf("%d\n",maxdis[1]);

       return 0;

}

void input()

{

       memset(maxdis,0,sizeof(maxdis));

       int a,b;

       long long c;

       head[1]=0;

       scanf("%d%d",&n,&m);

       for(int i=1;i<=m;++i)

       {

              scanf("%d%d%d",&a,&b,&c);

              edge[i].u=a;edge[i].v=b;

              edge[i].w=c;

              edge[i].next=head[a];

              head[a]=i;

              if(c>maxdis[a])

              maxdis[a]=c;

              edge[i+m].v=a;edge[i+m].u=b;

              edge[i+m].w=c;

              edge[i+m].next=head[b];

              head[b]=i+m;

              if(c>maxdis[b])

              maxdis[b]=c;

       }

}

void prim()

{

       memset(man,99,sizeof(man));

       man[1]=0;

       int k=1;

       visit[k]=1;

       tot+=man[k];

       for(int i=2;i<=n-1;++i)

       {

              int minxx=999999;

              for(int j=1;j<=n;++j)

              {

                     if(!visit[j]&&man[j]

                     {

                            minxx=man[j];

                            k=j;

                     }

              }

              visit[k]=1;

              tot+=man[k];

              for(int j=head[k];j!=0;j=edge[j].next)

              {

                     if(!visit[edge[j].v]&&edge[j].w

                     {

                            man[edge[i].v]=edge[j].w;

                           

                     }

                    

              }

       }

}

正确:

#include

#include

#include

#include

#include

#define maxn 100005

#define INF 0x7fffffff

 

long long cnt,head[maxn],fa[maxn],vis[maxn],down[maxn][2],up[maxn],dis[maxn];

int n,m;

struct node

   {

      int to;

      int next;

      int edge;

   }e[maxn<<2];

 

struct ss

   {

     int x,y,z;

   }a[maxn];

 

using namespace std;

 

void insert(int u,int v,int edge)

    {

     e[++cnt].to=v;

     e[cnt].edge=edge;

     e[cnt].next=head[u];

     head[u]=cnt;

       }

 

int find(int x)

   {

      if (fa[x]==x) return x;

      fa[x]=find(fa[x]);

      return fa[x];

   }

  

bool cmp(ss a,ss b)  

    {

           return a.z

       }

      

void dfs1(int rt)

   {

      vis[rt]=1;

      for (int i=head[rt];i;i=e[i].next)

        {

          if (!vis[e[i].to]) dfs1(e[i].to);

              else continue;

          if (down[e[i].to][0]+e[i].edge>down[rt][0])

                  {

                    down[rt][1]=down[rt][0];

                       down[rt][0]=down[e[i].to][0]+e[i].edge; 

                  }   

                  else if (down[e[i].to][0]+e[i].edge>down[rt][1])

                       down[rt][1]=down[e[i].to][0]+e[i].edge;

          }      

    }

      

void dfs2(int rt,int fat,int val)

    {

      vis[rt]=1;   

      long long tmp=0;      

      if (rt==1) up[rt]=0;

            else

                 {

                    up[rt]=up[fat]+val;

                   if (down[fat][0]==down[rt][0]+val) tmp=down[fat][1]+val;

                         else tmp=down[fat][0]+val;

                      up[rt]=max(up[rt],tmp);            

                 }

         dis[rt]=max(up[rt],down[rt][0]);

         for (int i=head[rt];i;i=e[i].next)

             if (!vis[e[i].to]) dfs2(e[i].to,rt,e[i].edge);     

       }    

      

int main()

   {

      scanf("%d%d",&n,&m);

      long long ans2=INF;

      for (int i=1;i<=m;i++)

        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);

      sort(a+1,a+m+1,cmp);

      for (int i=1;i<=n;i++) fa[i]=i;

      int k=0,ans=0;

      for (int i=1;i<=m;i++)

          {

               int fa1=find(a[i].x),fa2=find(a[i].y);

               if (fa1==fa2) continue;

               fa[fa2]=fa1;

               insert(a[i].x,a[i].y,a[i].z);

               insert(a[i].y,a[i].x,a[i].z);

               k++;

               ans+=a[i].z;

               if (k==n-1) break;

                     }

     printf("%lld\n",ans);

        memset(vis,0,sizeof(vis));

        dfs1(1);

        memset(vis,0,sizeof(vis));

        dfs2(1,0,0);

        for (int i=1;i<=n;i++)

           ans2=min(ans2,dis[i]);

        printf("%lld",ans2);                            

        return 0;

         }

转载于:https://www.cnblogs.com/c1299401227/p/5370766.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery面试题汇总

【jQuery】 [jQuery] 针对jQuery的优化方法有哪些&#xff1f; [jQuery]JQuery一个对象可以同时绑定多个事件&#xff0c;这是如何实现的&#xff1f; [jQuery] jQuery中如何将数组转化为json字符串&#xff0c;然后再转化回来&#xff1f; [jQuery] jQuery UI怎样自定义组…

H264中的SPS、PPS提取与作用

From: http://blog.csdn.net/sunnylgz/article/details/7680262 牛逼的视频会议网站&#xff1a;http://wmnmtm.blog.163.com/blog/#m0 http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Pa…

POJ 3991 Seinfeld

Seinfeld Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1285 Accepted: 599 Description I’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple problems look difficult and complex problems look easy. …

HTML面试题汇总

【HTML】 [html] 你有使用过MediaRecorder吗&#xff1f;说说它的运用场景有哪些&#xff1f; [html] 进入编辑页面时&#xff0c;如何把光标聚焦到第一个input&#xff1f; [html] 如何给input的右上角加个清除的按钮 [html] 举例说明只用html和css如何使得一个列表编号倒…

H264参数语法文档: SPS、PPS、IDR

From: http://blog.csdn.net/heanyu/article/details/6205390 H.264码流第一个 NALU 是 SPS&#xff08;序列参数集Sequence Parameter Set&#xff09; 对应H264标准文档 7.3.2.1 序列参数集的语法进行解析 SPS参数解析// fill sps with content of p[cpp] view plaincopyint …

悬浮动态分层导航

1、首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果&#xff08;从网站上下载即可&#xff09; 1 <script language"javascript" type"text/javascript" src"js/jquery-1.4.2.min.js"></script> 2、插入div&…

[Redux/Mobx] Redux怎么添加新的中间件?

[Redux/Mobx] Redux怎么添加新的中间件&#xff1f; applyMiddleware 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

php操作xml

<?php $xmlfile_get_contents("c.xml"); $simplenew SimpleXMLElement($xml); //var_dump($simple); //1查询 echo "<table border1>"; foreach ($simple->book as $book) {$attr$book->attributes();//获取节点属性echo "<tr>…

h264 图像、帧、片、NALU

From: http://blog.csdn.net/zqnihao917/article/details/7760170 图像、帧、片、NALU 是学习 H.264的人常常感到困惑的一些概念&#xff0c;我在这里对自己的理解做一些阐述&#xff0c;欢迎大家讨论&#xff1a;H.264 是一次概念的革新&#xff0c;它打破常规&#xff0c;完全…

Vue面试题汇总目录

【Vue】 [vue] vue组件里的定时器要怎么销毁&#xff1f; [vue] &#xff1c;template&#xff1e;&#xff1c;/template&#xff1e;有什么用&#xff1f; [vue] 你有使用过JSX吗&#xff1f;说说你对JSX的理解 [vue] 使用vue渲染大量数据时应该怎么优化&#xff1f;说下…

EXEC与sp_executesql的区别及应用

execute&#xff0c;简写为exec,除了用来执行存储过程&#xff0c;一般都用来执行动态Sql sp_executesql&#xff0c;sql2005中引入的新的系统存储过程&#xff0c;也是用来处理动态sql的,如&#xff1a; exec sp_executesql sql, Ncount int out,id varchar(20), cou out ,i…

React封装一个组件弹出框

目录 前言 代码 简要 引用 效果 前言 我是歌谣 放弃很容易 但是坚持一定很酷 为了保证react代码的一个简洁性 最近开始封装组件, 直接上代码 因为都很简单的模式 这边直接进行讲解 代码 //取消机构和取消讲师的方法封装 //params visible控制弹框的一个现实和隐藏 import…

h264 Nalu 详解

From: http://blog.csdn.net/d_l_u_f/article/details/7260772 1&#xff0e;引言 H.264的主要目标&#xff1a; 1&#xff0e;高的视频压缩比 2&#xff0e;良好的网络亲和性 解决方案&#xff1a; VCL video coding layer 视频编码层 NAL network abstraction layer …

Pytorch项目(模型训练与优化),肺癌检测项目之六

数据优化方案 数据优化方案1&#xff1a;重复抽样 &#xff08;1&#xff09;对多数类的样本实施欠采样&#xff0c;减少多数类数量 &#xff08;2&#xff09;对少数类的样本实施过采样&#xff0c;增加少数类数量 数据优化方案2&#xff1a;数据增强 数据增强&#xff08…

Oracle 中文排序

按照拼音顺序(常用) ORDER BY nlssort(NAME, NLS_SORTSCHINESE_PINYIN_M) 按照部首顺序 ORDER BY nlssort(NAME, NLS_SORTSCHINESE_RADICAL_M) 按照笔画顺序 ORDER BY nlssort(NAME, NLS_SORTSCHINESE_STROKE_M) 转载于:https://www.cnblogs.com/xcxcxcxc/p/554…

mac苹果屏幕截图快捷键

From: http://blog.csdn.net/w88193363/article/details/12647233 一般在Mac上用Command-Shif-3/4来截图。注&#xff1a;Command苹果键 其实还有几个辅助键&#xff0c;来起到不同的截图功能…… 011)Command-Shift-3&#xff08;适用于OS9,10.1X和10.2&#xff09; 02将整…

【数据库】SQL查询强化篇

查询是数据库的基本应用之一&#xff0c;oracle中的SQL查询语法&#xff0c;一方面遵循了SQL标准&#xff0c;另一方面又有自己的独特之处。 从而使得oracle中的SQL查询功能更加强大。接下来将会涉及oracle中的SQL查询语句&#xff0c;包括&#xff1a; 基本查询&#xff1a;主…

[python3] pyton socket 同步通信举例

本文比较简单&#xff0c;适合入门用&#xff0c;作个笔记&#xff0c;方便日后抄写 一个服务端&#xff0c;一个客户端&#xff0c;而且是阻塞方式&#xff0c;一次只能接受一个客户端连接并通信噢。 客户端发送‘bye, 结束与服务端的通信&#xff0c;如果发送’shutdown&…