K - Reward
-
HDU - 2647 题意: 每一层reward 都得比下一层高1 所以先找最低层初始化。 #include<bits/stdc++.h> using namespace std; #define maxn 10005 vector<int>mmp[maxn]; int n,m,in[maxn],u,v,cost[maxn],cnt,ans=0; int topo() { cnt=0; queue<int>q; for(int i=1; i<=n; i++) { if(in[i]==0) { q.push(i); cost[i]=888; cnt++; } } if(q.empty())return 0; else { while(!q.empty()) { int top=q.front(); q.pop(); for(int i=0; i<mmp[top].size(); i++) { in[mmp[top][i]]--; if(in[mmp[top][i]]==0) { cnt++; q.push(mmp[top][i]); cost[mmp[top][i]]=cost[top]+1; } } } } return cnt; } int main() { while(cin>>n>>m) { for(int i=1; i<=n; i++) { in[i]=0; mmp[i].clear(); } ans=0; while(m--) { cin>>u>>v; mmp[v].push_back(u); in[u]++; } if(topo()>0) { if(cnt<n) cout<<-1<<endl; else { for(int i=1; i<=n; i++) ans+=cost[i]; cout<<ans<<endl; } } else cout<<-1<<endl; } return 0; }