第三题:
#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;
}