usaco Sweet Butter

有N头牛,有P个牧场,C条边。

农夫将一块糖放在某个牧场中,要求所有牛到达这个牧场的总距离最短。

赤裸裸的Floyd,然后枚举将糖放在每个点,统计牛要走的路。

/*
ID: modengd1
PROG: butter
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int haveCow[801];//每个牧场里牛的数量
int dis[801][801];
#define INF 2139062143
int main()
{
    freopen("butter.in","r",stdin);
    freopen("butter.out","w",stdout);
    int N,P,C,temp,a,b,c;
    scanf("%d%d%d",&N,&P,&C);
    memset(haveCow,0,sizeof(haveCow));
    memset(dis,0x7f,sizeof(dis));
    for(int i=0;i<N;i++)
    {
        scanf("%d",&temp);
        haveCow[temp]++;
    }
    for(int i=0;i<C;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(c<dis[a][b])
        {
            dis[a][b]=c;
            dis[b][a]=c;
        }
    }
    for(int k=1;k<=P;k++)
    {
        for(int i=1;i<=P;i++)if(dis[i][k]!=INF)
        {
            for(int j=1;j<=P;j++)if(dis[k][j]!=INF)
            {
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
        dis[k][k]=0;
    }
    int ans=0x7fffffff;
    for(int i=1;i<=P;i++)
    {
        int temp=0;
        for(int j=1;j<=P;j++)
        {
            temp+=dis[i][j]*haveCow[j];
        }
        ans=min(ans,temp);
    }
    cout<<ans<<endl;
    return 0;
}

  

时间: 2024-11-18 19:04:38

usaco Sweet Butter的相关文章

USACO 3.2.6 Sweet Butter 香甜的黄油

Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费用在奶牛上. 农夫John很狡猾.像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场.他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶. 农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛).给出各头牛在的牧场和牧场间的路线,找出使所有牛

[USACO3.2]Sweet Butter

题目大意: 给定一张$k$个结点,$m$条边的无向图,其中有$n$个点被标记,在这$k$个点中找出一个点使得这个点到那$n$个点的最短距离之和最小,求出这个距离和. 思路: 对于每个标记结点跑最短路,最后枚举每个结点,求出其到各个标记结点的最短距离和,取$min$. 1 #include<cstdio> 2 #include<cctype> 3 #include<functional> 4 #include<ext/pb_ds/priority_queue.hpp

USACO butter

多次使用dijkstra就行, 代码如下: /* ID: m1500293 LANG: C++ PROG: butter */ #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace std; int N, P, C; //牛的数量 牧场的数量 边的数量 int cows[550]; s

USACO 3.2 butter 最短路

堆优化dijkstra 1 /* 2 PROB:butter 3 LANG:C++ 4 */ 5 6 #include <iostream> 7 #include <cstdio> 8 #include <queue> 9 #include <vector> 10 using namespace std; 11 const int Ni = 10000; 12 const int INF = 1<<27; 13 struct node{ 14 i

The 10 best sweet treats in Singapore

Every time I walk out of Changi airport's air-conditioning into the humid outdoors, there's a sweet and slightly fermented aroma that hits me on the first breath. A dozen visits to Singapore and I'm still startled by it. Within the hour, I barely not

COGS 696. [IOI1996][USACO 2.3] 最长前缀

★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中B

USACO prefix TrieTree + DP

/* ID:kevin_s1 PROG:prefix LANG:C++ */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib>

【USACO 1.3.4】牛式

[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ---------- * * * * 数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0. 注意一下在美国的学校中教的"部分乘积",第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积. 写一个程序找出所有的牛式. [格式] INPUT FORMAT: (f

USACO Chapter 1 Section 1.1

USACO的题解和翻译已经很多了... 我只是把自己刷的代码保存一下. 1.PROB Your Ride Is Here 1 /* 2 ID:xiekeyi1 3 PROG:ride 4 LANG:C++ 5 */ 6 7 #include<bits/stdc++.h> 8 using namespace std ; 9 10 int main() 11 { 12 freopen("ride.in","r",stdin); 13 freopen(&quo