P2419 [USACO08JAN] Cow Contest S--C++代码

本文介绍了一个C++程序,通过Breadth-FirstSearch(BFS)算法计算在给定的牛只网络中,每头牛能到达其他牛的最大距离,统计当所有牛都能到达时的计数。
摘要由CSDN通过智能技术生成

这个代码使用了BFS算法来寻找每个牛能够到达的最大距离,然后判断是否是一共n-1个牛都能够到达其他牛,如果是则计数加1,最后输出计数结果。

下面是一个C++代码的示例:

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int MAXN = 101;

vector<int> adj[MAXN];
int dist[MAXN];

int bfs(int start) {
    queue<int> q;
    q.push(start);
    dist[start] = 0;

    while (!q.empty()) {
        int curr = q.front();
        q.pop();

        for (int i = 0; i < adj[curr].size(); i++) {
            int next = adj[curr][i];
            if (dist[next] == -1) {
                dist[next] = dist[curr] + 1;
                q.push(next);
            }
        }
    }

    int maxDist = 0;
    for (int i = 1; i <= MAXN; i++) {
        if (dist[i] != -1) {
            maxDist = max(maxDist, dist[i]);
        }
    }

    return maxDist;
}

int main() {
    int n, m;
    cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        adj[a].push_back(b);
    }

    int count = 0;
    for (int i = 1; i <= n; i++) {
        fill(dist, dist + MAXN, -1);
        int maxDist = bfs(i);

        if (maxDist == n - 1) {
            count++;
        }
    }

    cout << count << endl;

    return 0;
}

以下是题目和代码: 题目描述: 农夫约翰想要了解他的奶牛们每天产生的牛奶量。他有 $N$ 头奶牛,编号为 $1,2,…,N$,他想要在连续的 $M$ 天里知道这些奶牛的总产量。他记录了每头奶牛在这 $M$ 天里每天产生的牛奶数量。 每天的奶牛产量都是非负的,但不一定相同。约翰想要知道哪些奶牛在这 $M$ 天里总共产生了至少 $G$ 加仑的牛奶。请帮助约翰找出这些奶牛。由于总共有 $N$ 头奶牛,你的算法的时间复杂度至多为 $O(NM)$,否则你可能会超时。 输入格式 第一行包含三个整数 $N,G,M$。 接下来 $N$ 行,每行包含 $M$ 个整数,表示每头奶牛在这 $M$ 天里每天的产量。 输出格式 每行输出一个奶牛的编号,表示这些奶牛中的每一头最少产出了 $G$ 加仑的牛奶。 输出这些编号的顺序应该与它们在输入中出现的顺序相同。 如果没有奶牛的总产量至少为 $G$ 加仑,则输出 NONE。 数据范围 $1≤N,M≤1000$ $0≤G≤10^9$ 输入样例: 5 24 2 15 20 20 10 25 18 30 32 40 50 输出样例: 1 2 3 4 c++ 代码: ```cpp #include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int N = 1010; int n, g, m; int sum[N][N]; //记录前缀和 vector<int> ans; int main() { cin >> n >> g >> m; for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) { int x; cin >> x; sum[i][j] = sum[i][j - 1] + x; } for (int i = 1; i <= n; ++i) { int s = 0; for (int j = 1; j <= m; ++j) s += sum[i][min(j + m - 1, m)] - sum[i][j - 1]; if (s >= g * m) ans.push_back(i); } if (ans.empty()) puts("NONE"); else for (auto x : ans) cout << x << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值