分析:
刚开始直接用模版WA了一次,后来想想才发现,可能有两个人(a和b)的工资没有要求a>b,所以这样就不能直接利用等差公式计算。。。
WA:
#include"stdio.h" #include"string.h" struct node { int num;//记录比他少的人的个数 int cnt;// int date[20];//比他少的人的标号 }A[10001]; int topsort(int n) { int i,j,k,f; k=0; while(k<n) { f=0; for(i=1;i<=n;i++) { if(A[i].cnt==0) { A[i].cnt--; k++; for(j=0;j<A[i].num;j++) { A[A[i].date[j]].cnt--; } f=1; break; } } if(f==0)return 0; } return 1; } int main() { int n,m; int i,j; int a,b; while(scanf("%d%d",&n,&m)!=-1) { memset(A,0,sizeof(A)); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); A[a].date[A[a].num++]=b; A[b].cnt++; } int ans=topsort(n); if(ans==0)printf("-1\n"); else printf("%d\n",n*(888*2+n-1)/2); } return 0; }
AC:
#include"stdio.h" #include"string.h" #define max(a,b) a>b?a:b; struct node { int ans; int num;//记录比他少的人的个数 int cnt;// int date[20];//比他少的人的标号 }A[10001]; int topsort(int n) { int i,j,k,f,t; k=0; while(k<n) { f=0; for(i=1;i<=n;i++) { if(A[i].cnt==0) { A[i].cnt--; k++; t=A[i].ans+1; for(j=0;j<A[i].num;j++) { A[A[i].date[j]].cnt--; A[A[i].date[j]].ans=max(A[A[i].date[j]].ans,t); } f=1; break; } } if(f==0)return 0; } return 1; } int main() { int n,m; int i,j; int a,b; while(scanf("%d%d",&n,&m)!=-1) { memset(A,0,sizeof(A)); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); A[b].date[A[b].num++]=a; A[a].cnt++; } int ans=topsort(n); if(ans==0)printf("-1\n"); else { ans=0; for(i=1;i<=n;i++) ans+=A[i].ans; ans+=888*n; printf("%d\n",ans); } } return 0; }