• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
山不在高,有金则名!
博客园    首页    新随笔    联系   管理    订阅  订阅

1345:【例4-6】香甜的黄油

【题目描述】

农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1≤N≤500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。

农夫John很狡猾。像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。

农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。

【输入】

第一行: 三个数:奶牛数N,牧场数P(2≤P≤800),牧场间道路数C(1≤C≤1450)。

第二行到第N+1行: 1到N头奶牛所在的牧场号。

第N+2行到第N+C+1行:每行有三个数:相连的牧场A、B,两牧场间距(1≤D≤255),当然,连接是双向的。

【输出】

一行 输出奶牛必须行走的最小的距离和。

【输入样例】

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

【输出样例】

8

【提示】

说明:放在4号牧场最优。

 

 

#include <bits/stdc++.h>
using namespace std;

const int M = 0x3f3f3f3f;
const int N = 805;
int a[N][N], w[N];

int main()
{
    // freopen("in.txt", "r", stdin);
    int n, p, c; // 奶牛n,牧场p,道路c
    scanf("%d%d%d", &n, &p, &c);
    int t; // 奶牛在哪个牧场
    for (int i = 0; i < n; i++) {
        scanf("%d", &t);
        w[t]++;
    }
    memset(a, M, sizeof(a));
    int x, y, d; // 距离d
    for (int i = 0; i < c; i++) {
        scanf("%d%d%d", &x, &y, &d);
        a[x][y] = a[y][x] = d;
    }
    // floyd
    for (int k = 1; k <= p; k++) {
        for (int i = 1; i <= p; i++) {
            for (int j = 1; j <= p; j++) {
                a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
            }
        }
    }
    // 枚举每一个点
    int ans = INT_MAX;
    for (int i = 1; i <= p; i++) {
        int sum = 0; // 求和
        for (int j = 1; j <= p; j++) {
            if (i == j) {
                continue;
            }
            sum += a[j][i] * w[j];
        }
        ans = min(ans, sum);
    }
    cout << ans;
    return 0;
}

  

 

posted @ 2021-11-21 14:13  杭州山不高  阅读(61)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3