hdu2647

来源:互联网 发布:lua php 性能 编辑:程序博客网 时间:2024/06/11 16:54
/*
分析:
    C提交中排第一,哦耶~
    刚开始害怕一个人可能有多个指向呢,开了10011*666的数组,
ac后又试了试,其实10011*15就够了……


    逆向拓扑排序,关系递推,注意有一个环节要取最大值哦~


                                                    2012-07-17
*/








#include"stdio.h"#include"string.h"struct A{int ts;int outdegree;int total;int mem[15];}E[10011];int max(int a,int b){return a>b?a:b;}int topsort(int n){int k,i,j;int flag;int temp;k=0;while(k<n){flag=0;for(i=1;i<=n;i++){if(E[i].outdegree==0){E[i].outdegree--;temp=E[i].ts+1;for(j=0;j<E[i].total;j++){E[E[i].mem[j]].outdegree--;E[E[i].mem[j]].ts=max(temp,E[E[i].mem[j]].ts);}flag=1;k++;}}if(flag==0)return 1;}return 0;}int main(){int n,m;int i;int a,b;int flag;int ans;while(scanf("%d%d",&n,&m)!=-1){for(i=1;i<=n;i++)E[i].ts=E[i].total=E[i].outdegree=0;while(m--){scanf("%d%d",&a,&b);E[a].outdegree++;E[b].mem[E[b].total++]=a;}flag=topsort(n);if(flag){printf("-1\n");continue;}ans=0;for(i=1;i<=n;i++)ans+=E[i].ts;ans+=888*n;printf("%d\n",ans);}return 0;}


原创粉丝点击