zzuli1619--发工资--用访问数组判断是否有环

来源:互联网 发布:街头格斗教学软件 编辑:程序博客网 时间:2024/04/28 20:38
#include<stdio.h>int m[10010][1000],g[10010],v[10010];int n,l;int find(int i){int max=887,j,ret;if(v[i])//进入那个节点就标记,出去的时候消掉,实际上这里存的就是深搜的栈return 0;//栈中出现重复访问,及出现环,返回0表示出错v[i]=1;//未形成环,标志它for(j=1;j<=m[i][0];j++)//找他前驱的最大工资{if(g[m[i][j]]==0)//前驱有未定工资的{ret=find(m[i][j]);if(ret==0)//前驱出错,直接返回0{v[i]=0;//***忘了在出错的时候也要恢复标志return 0;}}if(g[m[i][j]]>max)max=g[m[i][j]];}g[i]=max+1;//他的工资比前驱的最大数大1v[i]=0;//消除访问标志return 1;//操作成功}int main(){int i,a,b;while(scanf("%d%d",&n,&l)!=EOF){for(i=1;i<=n;i++){m[i][0]=0;g[i]=0;}for(i=0;i<l;i++){scanf("%d%d",&a,&b);m[a][0]++;m[a][m[a][0]]=b;}for(i=n;i>0;i--){if(g[i]==0){a=find(i);if(!a)break;}}if(!i){b=0;for(i=1;i<=n;i++)b+=g[i];printf("%d\n",b);}else{printf("-1\n");}}return 0;}

原创粉丝点击