HDOJ2467
来源:互联网 发布:淘宝推广佣金 编辑:程序博客网 时间:2024/06/08 06:59
#include<cstdio>#include<queue>#include<vector>using namespace std;const int MAXN=20000+50;int n,m;vector<int> Graph[MAXN];int TopNum[MAXN], NodeNum[MAXN];;void TopSort(){ queue<int> que; //int cnt2=0; for(int i=1;i<=n;i++){ if(Graph[i][0]==0) { que.push(i); TopNum[i]=0; //cnt2++; } } int cnt1=0; while(!que.empty()) { int v = que.front(); que.pop(); cnt1++; for(int i=1; i<Graph[v].size(); ++i) { if(--Graph[Graph[v][i]][0] == 0){ que.push(Graph[v][i]); // printf("%d---%d\n",v,Graph[v][i]); TopNum[Graph[v][i]]=TopNum[v]+1; // printf("%d,%d----%d,%d\n",v,TopNum[v],Graph[v][i],TopNum[Graph[v][i]]); } } } if(cnt1 != n){ printf("-1\n"); return ; } int sum=0; for(int i=1; i<=n; ++i) sum+=(TopNum[i]+888); printf("%d\n",sum);}int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++){ Graph[i].clear(); Graph[i].push_back(0); } for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); Graph[v].push_back(u); ++Graph[u][0]; } TopSort(); }}///逆向建图,用(topnum)拓扑数的排列序号+888(底薪),初始化opnum=0;