用邻接矩阵会超内存
更优的代码
#include<stdio.h> #include<string.h> typedef struct In{ int to,next,money; }; In edag[2*100010]; int n,t,into[100010]; int head[100010]; int max(int a,int b){ return a>b?a:b; } void add(int a,int b){ edag[t].to=a; edag[t].next=head[b];//反向建图 head[b]=t++; }//链式前向星 int topu(){ int i,tmp,j; for(i=1;i<=n;i++){ int k=1; while(into[k]!=0) k++;//找出出度为0的顶点 if(k>n) return -1; into[k]--; for(j=head[k];j>-1;j=edag[j].next){ int tmp=edag[j].to; into[tmp]--; edag[tmp].money=max(edag[k].money+1,edag[tmp].money);//取最大值 } } return 0; } int main(){ int m,i,j,s,a,b; while(~scanf("%d%d",&n,&m)){ memset(edag,0,sizeof(edag)); memset(into,0,sizeof(into)); memset(head,-1,sizeof(head)); t=0; for(i=0;i<m;i++){ scanf("%d%d",&a,&b);//注意要逆过来,因为a>b,b应当作为出度 add(a,b); into[a]++; } s=topu(); if(s==-1) printf("-1\n"); else{ for(i=1;i<=n;i++){ s+=edag[i].money; } printf("%d\n",s+888*n); } } return 0; }