Official

A - 友達の人気度 / Popularity of Friends Editorial by MMNMM


初心者の方へ

この問題は、たとえば次のような問題に読み替えることで解くことができます。

はじめ、すべてが \(0\) である長さ \(N\) の数列 \(X=(X _ 1,X _ 2,\ldots,X _ N)\) がある。 \(X\) に対して次の操作を \(M\) 回行う。

  • \(1\le u\lt v\le N\) を満たす整数 \(u,v\) が与えられる。\(X _ u\) に \(v\) を足し、\(X _ v\) に \(u\) を足す。

すべての操作が終わったあとの \(X\) の最大値を求めよ。

長さが \(N\) の配列を作成し、\(M\) 回の操作を実際に行って最大値を求めればよいです。

実装例は以下のようになります。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;

    vector<long> sum(N);
    for (int i = 0; i < M; ++i) {
        int u, v;
        cin >> u >> v;
        sum[u - 1] += v; // アクセスは 0-indexed
        sum[v - 1] += u;
    }

    // 最大値を出力する
    cout << ranges::max(sum) << endl;
    return 0;
}
N, M = map(int, input().split())

sum = [0 for i in range(N)]
for i in range(M):
    u, v = map(int, input().split())
    sum[u - 1] += v # アクセスは 0-indexed
    sum[v - 1] += u

# 最大値を出力する
print(max(sum))

posted:
last update: