[洛谷P1828] 香甜的黄油
作者:互联网
Description
给定三个数字m, n, c 表示有m头奶牛,n个牧场, c条道路
接下来m行 每行一个数字 表示i个奶牛在pp[i] 个牧场里
然后c行 每行三个数字x, y,z分别
表示x牧场和y牧场之间有一条道路,边权为z (无向图)
求一个牧场的编号 使得奶牛到这个牧场的总距离和最小
Solution
使用邻接表储存 先把每个奶牛所在的牧场编号放在一个数组里
枚举每一个牧场作为目标牧场 每次跑一边dijkstra 最后再把每个奶牛所在的牧场到目标牧场的距离求和
求最小的答案
AC code
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define pa pair<int, int> using namespace std; priority_queue<pa, vector<pa>, greater<pa> >q; int n, m, c, pp[3010], num, head[3010], dis[3010]; int vis[3010], ans = 0x3f3f3f; struct emmm { int next, to, dis; }e[3010]; void add(int from, int to, int dis) { e[++num].next = head[from]; e[num].to = to; e[num].dis = dis; head[from] = num; } void dijkstra (int s) { memset (dis, 0x3f3f3f, sizeof(dis)); memset (vis, 0, sizeof(vis)); dis[s] = 0; q.push (make_pair(0, s)); while (!q.empty()) { int now = q.top().second; q.pop(); if (vis[now]) continue; vis[now] = 1; for (int i = head[now]; i; i=e[i].next) { int v = e[i].to; if (dis[v] > dis[now] + e[i].dis) { dis[v] = dis[now] + e[i].dis; q.push (make_pair(dis[v], v)); } } } return ; } int main() { ios::sync_with_stdio(0); cin >> m >> n >> c; for (int i = 1;i <= m; i++) cin >> pp[i]; int x, y, z; for (int i = 1;i <= c; i++) { cin >> x >> y >> z; add(x, y, z); add(y, x, z); } for (int i = 1;i <= n; i++) { dijkstra(i); int sum = 0; for (int j = 1;j <= m; j++) sum+= dis[pp[j]]; ans = min(ans, sum); } cout << ans << endl; return 0; }AC Code
标签:include,洛谷,int,牧场,num,P1828,黄油,now,dis 来源: https://www.cnblogs.com/-sheldon/p/11358408.html