其他分享
首页 > 其他分享> > [洛谷P1828] 香甜的黄油

[洛谷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