Reward
我的代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int n, m;
vector<int>e[maxn];
int in[maxn], add[maxn];
void topsort(){
priority_queue<int , vector<int>, greater<int> > s;
// queue<int>s;
for(int i = 1; i <= n; i++){
if(in[i] == 0)
s.push(i);
}
int cnt = 0;
while(!s.empty()){
int x = s.top();
// int x = s.front();
s.pop();
cnt++;
for(int i = 0; i < e[x].size(); i++){
int y = e[x][i];
in[y]--;
add[y] = max(add[y], add[x] + 1);//核心。
if(in[y] == 0){
s.push(y);
// add[y] = add[x] + 1;
}
}
}
int ans = 0;
if(cnt != n) cout << "-1" << endl;
else{
for(int i = 1; i <= n; i++){
ans += (add[i] + 888);
}
cout << ans << endl;
}
}
int main(){
int x, y;
while(cin >> n >> m){
memset(in, 0, sizeof(in));
memset(add, 0, sizeof(add));
memset(e, 0, sizeof(e));
for(int i = 0; i <= n; i++)
e[i].clear();
for(int i = 1; i <= m; i++){
cin >> x >> y;
e[y].push_back(x);
in[x]++;
}
topsort();
}
}
wa点:
刚开始的组合是优先队列 + add[y] = add[x] + 1,但会发现此时你的x不一定是最前一层(因为优先队列)。因此要用优先队列+ add[y] = max(add[y], add[x] + 1)。
如果是队列,那么是bfs顺序,能确保最优,因此可以队列 + add[y] = add[x] + 1组合。
最好还是用add[y] = max(add[y], add[x] + 1)。←要深刻理解这个。