USACO 2008 November Gold Cheering up the Cows /// MST oj24381

题目大意:

输入n,p;n个点,p条路

接下来n行输入c[];在各个点需要花费的时间

接下来p行输入u,v,w;u点到v点的路需要花费时间w

求经过所有点且最后回到起点的最少花费时间

https://blog.csdn.net/HY_VFenux/article/details/68954199

将每条边的权值存为 路径花费*2+两端点花费

Kruscal求MST 最后加上开始位于起点的花费 即各个点中最少花费的一个

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 10005
#define P 100005
using namespace std;
int n,m,a[N],root[N];
struct NODE {
    int n,t,c;
    bool operator <(const NODE& b) const{
        return c<b.c;
    }
}no[P];
int getroot(int man)
{
    if(root[man]==man) return man;
    return root[man]=getroot(root[man]);
}
int main()
{
    scanf("%d%d",&n,&m);
    int mina=INF;
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        root[i]=i; mina=min(mina,a[i]);
    }
    int len=0;
    while(m--) {
        int u,v,w; scanf("%d%d%d",&u,&v,&w);
        no[len++]={u,v,2*w+a[u]+a[v]};
    }
    sort(no,no+len);
    int cnt=0, ans=0;
    for(int i=0;i<len;i++) {
        int u=no[i].n, v=no[i].t, w=no[i].c;
        int ru=getroot(u), rv=getroot(v);
        if(ru!=rv){
            root[rv]=ru; cnt++; ans+=w;
        }//printf("%d\n",ans);
        if(cnt==n-1) break;
    }
    printf("%d\n",ans+mina);

    return 0;
}

原文地址:https://www.cnblogs.com/zquzjx/p/9286381.html

时间: 2024-08-24 08:17:16

USACO 2008 November Gold Cheering up the Cows /// MST oj24381的相关文章

【USACO 2008 Nov Gold】 2.Cheering up the Cows 最小生成树、

题意:可以理解为给你一个图,让你建一个树,然后从某根开始走,每走一条边就要消耗两边点权+边的边权.最后再加上一个根的点权,问最少花多少代价. 题解:改变边权然后做最小生成树. #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 #define inf 0x3f3f3f3f us

【USACO 2008 Nov Gold】 1.Mixed Up Cows 状压DP、

题解: 首先考虑dfs,但是看到答案的"64bit"就放弃了吧. 所以肯定是组合数.状压DP什么的,尤其是那个16,标准的状压数. 好吧,就是状压DP. f[i][j]表示i是状压的01串表示哪个取了哪个没取,然后j是结尾字符, 虽然水,但是时间复杂度是可以过的. 代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include &

【BZOJ1229】【USACO 2008 Nov Gold】 4.Toys sadstory 三分+贪心

sad story:我们自己oj的数据貌似有点问题.标程WA了5% 题解: 复制去Google翻译翻译结果 首先引一下VFK神犇的证明来证明一下这道题是三分.. { 我来告诉你世界的真相 = = 因为这题能最小费用最大流 每次最短路长度不降 所以是单峰的 最短路长度就是差分值.. 所以一阶导不降.. 是不是简单粗暴 你要证函数是单峰的. 当然是证斜率什么的 } 三分完初始买了多少个玩具,然后就是贪心. 首先我想说这个贪心真动规.虽然它真的是贪心. 首先先说一种错误的贪心. 就是从前往后扫,优先用

【POJ3659】【USACO 2008 Jan Gold】 3.Cell Phone Network 树上最小支配集/贪心 两种做法

题意:求树上最小支配集 最小支配集:点集,即每个点可以"支配"到相邻点,求最少点数可以使所有点被支配. 图上的最小支配集是NP的,但是树上的可以DP做,是O(n)的. 暴力做就好了, f[i]表示此 点被选时的子树全支配的最小代价 g[i]表示其父亲节 点被选时的子树全支配的最小代价 h[i]表示其某子节 点被选时的子树全支配的最小代价 然后暴力转移. (v是子节点) f[x]=∑(min(f[v],min(g[v],h[v])))+1; g[x]=∑(min(f[v],h[v]));

【POJ3666】【USACO 2008 Feb Gold】 2.Cow Game 动规

题意:有若干个数,然后可以花费i的代价让某个数+i或者-i. 现在要求让你把序列排成不升或者不降,问最小代价. 题解: 首先可以证明,最优花费下最后所有的数都可以是现在的某个数: 证:如果两个数调整后在两个数中间,那么可以把两个数都变为其中一个数,而代价显然是等同的. 这个出来后就好做了. 我们可以先离散化一下,然后f[i][j]表示第i个数变为j时1~i这些数保持非严格单调的最小花费 转移时f[i][j]不必n*n枚举,可以维护一个前缀最优(非常水),然后O(1)转移. 然后做一遍非升,一遍非

【BZOJ1589】【USACO 2008 Dec Gold】 1.Trick or Treat on the Farm 基环树裸DP、

没测样例一遍A这真是-- 题意:每个点都有且仅有一个出边(可以出现自环),然后这样一个点出发就会走过且一定走过某些点. 问每个点出发都会走过几个点. 首先这是基环树无疑. 然后就是裸DP了. 这个的关键就是找环,仅此. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 using namespace std; int n

【POJ3657】【USACO 2008 Jan Gold】 1.Haybale Guessing 二分答案,并查集check

题意: 输入n.m表示数列长度为n,有m条有序的限制{l,r,x}. 限制:l~r间所有数最小值为x. 问到第几条限制开始出现矛盾,都不出现输出"0". 题解: 首先这题比较厉害,正常解有点难,不妨转化成二分答案. 我们二分"答案",也就是第ans条出现矛盾. 考虑到若一条限制S所在区间被另一个限制Seg包含,且Seg这条限制的x又比S.x大, 那么也就是意为 ① [Seg.l,Seg.r]间最小值为Seg.x ② [S  .l,S  .r]间最小值为S  .x ③

【POJ3658】【USACO 2008 Jan Gold】 2.Artificial Lake人工湖 单调栈

人工湖 Time Limit: 1 Sec  Memory Limit: 128 MB Description 夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,FJ 决定建一个人工湖供奶牛消暑之用.为了使湖看起来更加真实,FJ决定将湖的 横截面建成N(1 <= N <= 100,000)个连续的平台高低错落的组合状,所有的平台 从左到右按1..N依次编号.当然咯,在湖中注入水后,这些平台都将被淹没. 平台i在设计图上用它的宽度W_i(1 <= W_i <= 1,000

【USACO 2008 Open Gold】 2.Crisis on the Farm 动规、

题意:输入n.m.p然后是n头牛塔坐标.m个草垛坐标,有p次指令机会. 每次指令可以向上下左右其中一种方向,让所有牛塔都移动一单位. 然后每经过草垛/牛塔次,就有1个权值. 求权值最大值及使权值最大的移动指令序列(字典序最小). 题解:f[i][j][k]表示第i次,移动序列x轴坐标为j,y轴k,最大权值. 然后倒着做以保证字典序. 代码: #include <cstdio> #include <cstring> #include <iostream> #include