第三题:
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
    int m, n, k;
    cin >> m >> n >> k;
    vector<int> tmp;
    map<int, vector<int> > datas; // int为序号,vector为依赖他的结点
    for (int i = 0; i <= m; i++) {
        vector<int> tmp;
        datas[i] = tmp;
    }

    vector<int> yilai(m + 1, 0); // 结点i是否有依赖,0为无依赖可以直接操作
    vector<int> done(m + 1, 0);  // 结点i是否已完成,0为未完成
    int left, right;

    for (int i = 0; i < k; i++) {
        cin >> left >> right;
        yilai[left] = 1;
        datas[right].push_back(left);
    }

    int ans = 0;
    int conutOfDone = 0; // 当前已完成计数
    while (conutOfDone != m) {
        int conutoftodo = 0;
        vector<int> deal;
        for (int i = 1; i <= m; i++) {
            if (yilai[i] == 0 && done[i] == 0) {
                conutoftodo++;
                conutOfDone++;
                deal.push_back(i); // 存储当前待完成结点,用于更新各数组
            }
        }
        if (conutoftodo == 0 && conutOfDone != n) {
            cout << "E" << endl;
            return -1;
        }
        else if (conutoftodo <= n)
            ans++;
        else if (conutoftodo > n) {
            if (conutoftodo % n == 0)
                ans = ans + conutoftodo / n;
            else
                ans = ans + conutoftodo / n + 1;
        }
        for (int i = 0; i < deal.size(); i++) { // 更新各个数组
            done[deal[i]] = 1;
            vector<int> ttt = datas[deal[i]];
            for (int j = 0; j < ttt.size(); j++)
                yilai[ttt[j]] = 0;
        }
    }
    cout << ans << endl;
    return 0;
}