首页 > 其他分享 >[USACO3.2] 香甜的黄油 Sweet Butter(Dijkstra)

[USACO3.2] 香甜的黄油 Sweet Butter(Dijkstra)

时间:2024-09-08 11:49:25浏览次数:3  
标签:Butter int Sweet 牧场 len inq Dijkstra 整数 奶牛


 Farmer John 发现了做出全威斯康辛州最甜的黄油的方法:糖。

把糖放在一片牧场上,他知道 N NN 只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。

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

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

输入格式
第一行包含三个整数 N , P , C,分别表示奶牛数、牧场数和牧场间道路数。

第二行到第 N+1 行,每行一个整数,其中第 i 行的整数表示第 i−1 头奶牛所在的牧场号。

第 N+2 行到第 N+C+1 行,每行包含三个整数 A,B,D,表示牧场号为 A  和 B 的两个牧场之间有一条长度为 D 的双向道路相连。

输出格式
输出一行一个整数,表示奶牛必须行走的最小的距离和。

这道题实际上就是要求出所有有牛的牧场的到每个牧场的最短路。由于牧场的数量比较多,这里不能使用 floyd 算法了,所以可以考虑使用 p 次 SPFA。

然后剩下的工作就是枚举每个牧场然后把每一头奶牛到这个牧场的最短路径长度加起来求个和,比较所有的和的最小值。

#include <bits/stdc++.h>
using namespace std;
const int N = 1001;
const int M = 10101;
const int inf = 0x3f3f3f3f;
struct Edge {
    int to, next, len;
} e[M * 2];
int h[N], tot = -1, n, p, c, d[N], inq[N], cnt[N], x, ans = 1e9;
queue<int> q;
void addEdge(int x, int y, int len) {
    e[++tot] = {y, h[x], len};
    h[x] = tot;
}
void spfa(int s) {
    memset(d, 0x3f, sizeof(d));
    memset(inq, 0, sizeof(inq));
    d[s] = 0;
    inq[s] = true;
    q.push(s);
    while (!q.empty()) {
        int v = q.front();
        q.pop();
        inq[v] = false;
        for (int i = h[v]; i != -1; i = e[i].next) {
            int to = e[i].to;
            if (d[to] > d[v] + e[i].len) {
                d[to] = d[v] + e[i].len;
                if (!inq[to]) {
                    q.push(to);
                    inq[to] = true;
                }
            }
        }
    }
    int sum = 0;
    for (int i = 1; i <= p; i++) {
        sum += cnt[i] * d[i];
    }
    ans = min(ans, sum);
}
int main() {
    cin >> n >> p >> c;
    memset(h, -1, sizeof(h));
    for (int i = 1; i <= n; i++) {
        cin >> x;
        cnt[x]++;
    }
    for (int i = 0; i < c; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        addEdge(u, v, w);
        addEdge(v, u, w);
    }
    for (int i = 1; i <= p; i++) {
        spfa(i);
    }
    cout << ans;
    return 0;
}

标签:Butter,int,Sweet,牧场,len,inq,Dijkstra,整数,奶牛
From: https://blog.csdn.net/yymer214/article/details/141787528

相关文章

  • 求两点间最短路的Dijkstra算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################设源点为u0u_{0}u0​,目标......
  • Dijkstra's algorithm All In One
    Dijkstra'salgorithmAllInOne迪杰斯特拉算法DijkstraDijkstra'salgorithm(/ˈdaɪkstrəz/DYKE-strəz)isanalgorithmforfindingtheshortestpathsbetweennodesinaweightedgraph,whichmayrepresent,forexample,roadnetworks.Dijkstra算法是一种......
  • 基于A*算法、Dijkstra算法的路径规划研究(Matlab代码实现)
      ......
  • SPFA && dijkstra 模版
    boolSPFA(ints){ intcnt=0; memset(dis,0x3f,sizeof(dis)); queue<int>q; q.push(s); vis[s]=1;dis[v]=0; while(!q.empty()) { intu=q.front();q.pop(); vis[u]=0; for(inti=0;i<g[u].size();i++) { intv=g[u][i].v,w=g[u][i].w; if(d......
  • Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
    说明Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV)BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE)SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处......
  • 最短路 - Dijkstra 算法
    Dijkstra(迪杰斯特拉)算法是基于贪心思想的单源最短路算法暴力Dijkstra具体如下:structnode{ intv,w;};vector<node>e[N];intdist[N],vis[N];e[u]存的是节点u的所有出边的终点和边权,dist[u]存u到原点s的最小距离,vis[u]标记是否走过voiddijkstra(int......
  • 《数据结构》最短路径Dijkstra算法
                                    最短路径Dijkstra算法分析生长点ABCDEFP(A)=FAD(A)=130P(B)=FBD(B)=24P(C)=FCD(C)=10P(D)=——D(D)=无穷P(E)=——D(E)=无穷CP(A)=FAD(A......
  • 迪杰斯特拉(Dijkstra)算法(C/C++)
    迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格·迪科斯彻(EdsgerDijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法,每次遍历到始......
  • 以node / link文件表征的道路网络-----dijkstra算法yyds-----基于南京公路公开数据做
    前文已经基于公开数据,获得了南京的全域高速公路的路网数据,这些以node/link文件表征的道路网络不仅延续了osm地图中所包含的经纬度、名称、容量等信息,还包含了一个重要的道路等级字段“link_type_name”。交通部门一般以高速公路、国省干道、城市道路、乡道农路作为区分......
  • 基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)
     ......