hdu 2647 Reward

来源:互联网 发布:java简历包装项目经验 编辑:程序博客网 时间:2024/06/11 13:02

逆拓扑排序,开始死活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;}


0 0