标签:
逆拓扑排序,开始死活a不掉,后来才发现自己记录工资的方法是有问题的.....失策失策啊
#include<iostream> #include<queue> #include<vector> #include<cstdio> #define maxn 10000+100 using namespace std; vector<vector<int> >mapp; int head[maxn]; int money[maxn]; int n,m; void topo() { int sum=0,t=0; queue<int>root; for(int i=1;i<=n;i++) { if(!head[i]) root.push(i); } //salary++; while(root.size()) { int x=root.front() ; root.pop() ; int temp=money[x]; //sum+=salary; t++; for(int i=0;i<mapp[x].size() ;i++) { head[mapp[x][i]]--; if(!head[mapp[x][i]]) root.push(mapp[x][i]),money[mapp[x][i]]=temp+1; } //if(flag) salary++; } if(t==n) { sum+=n*888; for(int i=1;i<=n;i++) sum+=money[i]; cout<<sum<<endl; } else cout<<"-1"<<endl; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { mapp.resize(n+1); for(int i=0;i<n+1;i++) money[i]=head[i]=0,mapp[i].clear(); while(m--) { int x,y; cin>>x>>y; mapp[y].push_back(x); head[x]++; } topo(); } return 0; }
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/45050827