codevs 1700 施工方案第二季

1700 施工方案第二季

2012年市队选拔赛北京

时间限制: 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

分类标签 Tags 点此展开

思路:先跑最小生成树,得出第一个答案。

第二期任务是要求最远距离最小,我们可以很容易的得出以下结论:这个点一定位于这棵树的直径上,并且是这棵树的直径的中点。

找到这个点后,再跑一个spfa或者dfs,找出离这个点最远的点,这个距离就是答案。

错因:别忘了开long long。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXNCNT 100010
#define MAXEDGE 200010
using namespace std;
long long ans,ans2;
int n,m,tot,src,decc,home;
long long minn=0x7f7f7f7f,mann=0x7f7f7f7f;
long long dis[MAXNCNT],cap[MAXEDGE*2];
long long sum1[MAXNCNT],sum2[MAXNCNT];
int fa[MAXNCNT],dad[MAXNCNT],vis[MAXNCNT];
int to[MAXEDGE*2],net[MAXEDGE*2],head[MAXNCNT];
struct nond{ int u,v;long long w; }v[MAXEDGE];
int abs(int x){ return x>0?x:-x; }
int cmp(nond a,nond b){ return a.w<b.w; }
int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); }
void add(int u,int v,long long w){
    to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
    to[++tot]=u;cap[tot]=w;net[tot]=head[v];head[v]=tot;
}
void spfa(int s){
    queue<int>que;
    memset(vis,0,sizeof(vis));
    memset(dis,0x7f,sizeof(dis));
    dis[s]=0;vis[s]=1;que.push(s);
    while(!que.empty()){
        int now=que.front();
        que.pop();vis[now]=0;
        for(int i=head[now];i;i=net[i])
            if(dis[to[i]]>dis[now]+cap[i]){
                dis[to[i]]=dis[now]+cap[i];
                if(!vis[to[i]]){
                    vis[to[i]]=1;
                    que.push(to[i]);
                }
            }
    }
}
void dfs(int now){
    for(int i=head[now];i;i=net[i])
        if(dis[to[i]]==-1){
            dis[to[i]]=dis[now]+cap[i];
            dfs(to[i]);
        }
}
void dfs1(int now){
    for(int i=head[now];i;i=net[i])
        if(dad[now]!=to[i]){
            dad[to[i]]=now;
            sum1[to[i]]=sum1[now]+cap[i];
            dfs1(to[i]);
        }
}
void dfs2(int now){
    for(int i=head[now];i;i=net[i])
        if(dad[now]!=to[i]){
            dad[to[i]]=now;
            sum2[to[i]]=sum2[now]+cap[i];
            dfs2(to[i]);
        }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d%lld",&v[i].u,&v[i].v,&v[i].w);
    sort(v+1,v+1+m,cmp);
    for(int i=1;i<=n;i++)    fa[i]=i;
    for(int i=1;i<=m;i++){
        int dx=find(v[i].u);
        int dy=find(v[i].v);
        if(dx==dy)    continue;
        fa[dy]=dx;ans+=v[i].w;
        add(v[i].u,v[i].v,v[i].w);
    }
    printf("%lld\n",ans);
    memset(dis,-1,sizeof(dis));
    decc=1;dis[decc]=0;dfs(decc);
    for(int i=1;i<=n;i++)
        if(dis[i]>dis[decc])    decc=i;
    memset(dis,-1,sizeof(dis));
    dis[decc]=0;dfs(decc);src=decc;
    for(int i=1;i<=n;i++)
        if(dis[i]>dis[decc])    decc=i;
    dfs1(src);memset(dad,0,sizeof(dad));
    dfs2(decc);memset(dad,0,sizeof(dad));
    for(int i=1;i<=n;i++){
        long long little=abs(sum1[i]-sum2[i]);
        if(little<minn){ mann=sum1[i];home=i;minn=little; }
        else if(little==minn)
            if(sum1[i]<mann){ mann=sum1[i];home=i; }
    }
    spfa(home);
    for(int i=1;i<=n;i++)
        if(i!=home&&dis[i]>ans2)    ans2=dis[i];
    cout<<ans2;
}

原文地址:https://www.cnblogs.com/cangT-Tlan/p/8831065.html

时间: 2024-10-12 03:02:55

codevs 1700 施工方案第二季的相关文章

CODEVS——T 1700 施工方案第二季

http://codevs.cn/problem/1700/ 2012年市队选拔赛北京 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案,如果这m条暗道都实施挖掘,肯定能达到互联互通的目的.事实上,适当选择其中n-1个方案挖掘,就能实现互联互通,即

codevs1700 施工方案第二季

题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案,如果这m条暗道都实施挖掘,肯定能达到互联互通的目的.事实上,适当选择其中n-1个方案挖掘,就能实现互联互通,即从每个地堡出发都能到达其他任何一个地堡(允许经过别的地堡). 连长精心谋算,在m个设计规划中选取了挖掘总距离最短且能保证互联互通的若干个暗道规划实施了挖掘,完成了第一期的施工任务后又接受了第

COJ262 HDNOIP201206施工方案

HDNOIP201206施工方案 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工.第一期的任务是挖掘暗道让所有地堡互联互通. 现已勘测设计了m条互不相交的暗道挖掘方案,如果这m条暗道都实施挖掘,肯定能达到互联互通的目的. 事实上,适当选择其中n-1个方案挖掘,就能实现互联互通,即从每个地堡出发都能到达其他任何一个地堡(允许经过别的地堡). 连长精

《欢乐颂》第二季来袭:程序员救美,邱莹莹终于找到靠谱男

<欢乐颂>前不久刚迎来大结局,大家就马上开始期待第二季了.都市剧那么多,却独独火了它.也许这部剧成功之处就在于它真实,因为大部分人都能从剧中找到现在或是曾经的自己. 现实生活中,我们大多都是像邱莹莹这样的普通人,羡慕曲筱绡,梦想做安迪,一直像关雎尔一样拼命努力,最后发现只是比樊胜美过得好一些.很多人讨厌邱莹莹的无知和冲动,但看到最后却发现,她虽然被公司辞退,却通过自己的网购经验,误打误撞把咖啡厅的工作做的有声有色. 你以为到这里,邱莹莹迎来了完美结局,故事就要结束了吗?NONONO,有一种故事

第二季来袭:奶茶妹妹都用Lync开会了,你们一定要知道的Lync会议的秘密噢~

大家对第一季的关注促使我继续编写第二季,感觉有点像美剧,收视率高我们就继续,哈哈~~写点啥,Lync内容太多了,最近听说奶茶妹妹入职微软了都在使用Lync开会了,那我们就一起谈谈Lync会议的秘密吧! 秘密1:你可以通过视频看到奶茶妹妹噢,还可以设置为重点关注对象. 从Lync 2013开始我们可以支持高清视频了哈,用户在会议过程中视频分辨率最高能够达到1080P级别,也就是1920 x 1080的全高清分辨率噢.另外,在Lync 2013我们可以支持多路视频,可以同时展示5个发言者的视频,并可

原创:一个由计算采购平均单价引发的学案【第二季】

原创:一个由计算采购平均单价引发的学案[第二季] 背景:                    上集讲到接到朋友请求,要统计2012年每月的平均采购单价,按要求统计完,发给他之后:刚刚抽了根烟,朋友说还有2013和2014年的也要统计:问我能否把方法告诉他,考虑到sumpoduct函数用起来稍有些复杂,担心电话里说不清楚,就没有讲: 想想帮人就帮到底,干脆就帮他把2013和2014年的也直接帮他统计好了,发给了他: 启发:                    后来想到这个案例还是蛮经典的,也是

微信公众平台深度开发JAVA版第二季视频教程

微信公众平台深度开发JAVA版第二季(九宝饭店微信点餐系统)视频教程下载密码:qa4a     联系QQ:1026270010 微信作为当前流行的通信社交软件有了上亿的用户量,几乎每一个只能手机都要安装微信.但是,市场上对于JAVA开发微信公众平台的资料却少之又少,多数的资料一般是其他语言的.因此,主讲老师经过潜心研究.认真准备,录制了这套针对JAVA开发语言的微信公众平台开发教程. 1.课程研发环境 开发语言:JAVA WEBServer:TOMAT DATABASE:MySQL 开发工具:m

OpenGL小试牛刀第二季(粒子模拟)

效果截图:粒子模拟代码展示:#include "Particle.h" /** 构造函数 */CParticle::CParticle(){ data = NULL; numparticle = 0; } /** 析构函数 */CParticle::~CParticle(){ delete []data; data = NULL;} /** 创建一个包含num个元素的粒子数组 */int CParticle::Create(long num){ /** 删除粒子数组 */ if (da

OSChina 周二乱弹 —— 我容易吗我第二季

9月1日,一不小心又是新的一个月,各位OSCer大家壕.昨天是开源中国七周年生日,收到OSCer一大波的祝福,小小编一激动,又要发福利了,不过,请大家先拨打120叫好救护车再往下看: @twosnail:开源中国 7 周年纪念日 @change_solider:OSC 生日快乐! @青木河:OSC 生日快乐!希望我兰每天都快乐!希望红薯每天都自恋!希望菲姨依然热门!希望李博文继续臭不要脸! @翻墙攻城势:今天是:开源中国 7 周年纪念日 有什么用, 就是有福利啊!真空美人鱼- @小小编辑:在大角