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;

原创粉丝点击