【ABC373】AtCoder Beginner Contest 373【C++】

### コンテスト名
AtCoder Beginner Contest 373

### コンテストURL
https://atcoder.jp/contests/abc373

### 開催日
2024/09/28 21:00-22:40

---

## [A: September](https://atcoder.jp/contests/abc373/tasks/abc373_a)
**解法**
- 順番に判定する
```cpp:ABC373A.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    int cnt = 0;
    string s;
    for(int i=1; i<=12; i++){
        cin >> s;
        if(i==s.size()){
            cnt++;
        }
    }
    cout << cnt << endl;

    return 0;
}
```

## [B: 1D Keyboard](https://atcoder.jp/contests/abc373/tasks/abc373_b)
**解法**
- `map<char, int>` で各文字の位置を記録してシミュレーションする
```cpp:ABC373B.cpp
#include <iostream>
#include <string>
#include <map>
#include <cmath>
using namespace std;

int main(){
    string s;
    cin >> s;

    map<char, int> M;
    for(int i=0; i<s.size(); i++){
        M[s[i]] = i;
    }

    int sum = 0;
    for(int i=0; i<s.size()-1; i++){
        sum += abs(M['A'+i+1]-M['A'+i]);
    }

    cout << sum << endl;

    return 0;
}
```

## [C: Max Ai+Bj](https://atcoder.jp/contests/abc373/tasks/abc373_c)
**解法**
- $A$ の最大値と $B$ の最大値をそれぞれ求める
```cpp:ABC373C.cpp
#include <iostream>
#include <algorithm>
using namespace std;

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

    int maxa = -1e9, maxb = -1e9;
    int a, b;
    for(int i=0; i<n; i++){
        cin >> a;
        maxa = max(maxa, a);
    }
    for(int i=0; i<n; i++){
        cin >> b;
        maxb = max(maxb, b);
    }

    cout << maxa + maxb << endl;

    return 0;
}
```

## [D: Hidden Weights](https://atcoder.jp/contests/abc373/tasks/abc373_d)
**解法**
1. 幅優先探索 (BFS)
2. 深さ優先探索 (DFS)
- 与えられた有向辺と逆向きに重み $-w$ の辺を追加する
```cpp:ABC373D_1.cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

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

    vector<vector<pair<int, int>>> G(n);
    int u, v, w;
    for(int i=0; i<m; i++){
        cin >> u >> v >> w;
        u--;
        v--;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, -w);
    }

    vector<long long int> X(n);
    vector<int> seen(n, -1);
    queue<int> Q;

    for(int i=0; i<n; i++){
        if(seen[i]!=-1){
            continue;
        }

        X[i] = 0;
        seen[i] = 1;
        Q.push(i);
        while(!Q.empty()){
            int now = Q.front();
            Q.pop();

            for(int j=0; j<G[now].size(); j++){
                auto [next, w] = G[now][j];
                if(seen[next]!=-1){
                    continue;
                }
                X[next] = X[now] + w;
                seen[next] = 1;
                Q.push(next);
            }
        }
    }

    for(int i=0; i<n; i++){
        if(i){
            cout << " ";
        }
        cout << X[i];
    }
    cout << endl;

    return 0;
}
```
```cpp:ABC373D_2.cpp
#include <iostream>
#include <vector>
using namespace std;

vector<vector<pair<int, int>>> G;
vector<long long int> X;
vector<int> seen;

void dfs(int v, long long int w){
    seen[v] = 1;
    X[v] = w;

    for(int i=0; i<G[v].size(); i++){
        auto [next, weight] = G[v][i];
        if(seen[next]!=-1){
            continue;
        }
        dfs(next, X[v]+weight);
    }
}

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

    G.resize(n);
    int u, v, w;
    for(int i=0; i<m; i++){
        cin >> u >> v >> w;
        u--;
        v--;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, -w);
    }

    X.resize(n);
    seen.assign(n, -1);

    for(int i=0; i<n; i++){
        if(seen[i]!=-1){
            continue;
        }
        dfs(i, 0);
    }

    for(int i=0; i<n; i++){
        if(i){
            cout << " ";
        }
        cout << X[i];
    }
    cout << endl;

    return 0;
}
```