hdu 2647 (拓扑)
分析:
刚开始直接用模版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;
}

浙公网安备 33010602011771号