• bzoj1232[Usaco2008Nov]安慰奶牛cheer*


    bzoj1232[Usaco2008Nov]安慰奶牛cheer

    题意:

    给出n个节点的带权图,第i个节点ci。现在你要在这个图中选出一棵树和一个起点,然后你要从起点出发到达所有的节点(不能跳点)再回到起点,经过边的时间为边权,每经过一个点就要花等同于点权的时间(即使这个点已经过)。问如何使时间最短。n≤10000。

    题解:

    每条边的边权为这条边原来的边权加两个端点的点权(因为每个点都要经过两次),然后做最小生成树。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 10010
     7 using namespace std;
     8 
     9 inline int read(){
    10     char ch=getchar(); int f=1,x=0;
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    12     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    13     return f*x;
    14 }
    15 struct e{int f,t,w;}es[maxn*10]; bool cmp(e a,e b){return a.w<b.w;} int c[maxn],n,m,mn,ans,tot,fa[maxn];
    16 int find(int x){
    17     return x==fa[x]?x:fa[x]=find(fa[x]);
    18 }
    19 int main(){
    20     n=read(); m=read(); inc(i,1,n)c[i]=read(); mn=0x3fffffff; inc(i,1,n)mn=min(mn,c[i]);
    21     inc(i,1,m){int a=read(),b=read(),d=read(); es[i]=(e){a,b,d*2+c[a]+c[b]};}
    22     inc(i,1,n)fa[i]=i; sort(es+1,es+1+m,cmp);
    23     inc(i,1,m){
    24         int x=find(es[i].f),y=find(es[i].t); if(x!=y)fa[x]=y,tot++,ans+=es[i].w; if(tot==n-1)break;
    25     }
    26     printf("%d",ans+mn); return 0;
    27 }

    20160918

  • 相关阅读:
    LG gram 双系统全指南
    离散数学读书记录
    研究小报告:掺杂硅脂对处理器散热能力的影响
    SICP 课程总结 & 复习
    maxHeap 的 python 实现
    KDD Cup 2018 冠军团队 思路分享
    mergeSort, quickSort, shellSort 的 python 实现
    数据集-搜集
    【NOIP2018模拟赛】
    【NOIP2018 模拟】
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5882917.html
Copyright © 2020-2023  润新知