正在加载...
题目大意:农场主要给大家发工资,但是工人们会有比较,农场主想要合理(不引发争吵)和发出的工资最少。给出1 2表示1 的工资一定要比2高。
解题思路:拓扑排序,但是要注意的是关系矩阵要简化, 否则超内存。
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h>
#include<string.h>
int n,m,u,v;
struct node
{
int v,next;
} edge[30001];
int cnt;
int mony[10001],du[10001],cun[10001],head[10001];
void creat()
{
edge[cnt].v=u;
edge[cnt].next=head[v];
head[v]=cnt++;
}
void tp()
{
int i,j,k;
int low=0,top=0,sum=0,ren=0;
for(i=1; i<=n; i++)
if(du[i]==0)
{
cun[top]=i;
mony[top++]=888;
}
if(top==0)
{
printf("-1\n");
return ;
}
while(low<top)
{
k=cun[low];
sum+=mony[low];
ren++;
j=head[k];
while(1)
{
du[edge[j].v]--;
if(du[edge[j].v]==0)
{
cun[top]=edge[j].v;
mony[top++]=mony[low]+1;
}
if(j==-1)
break;
j=edge[j].next;
}
low++;
}
if(ren == n)
printf("%d\n",sum);
else
printf("-1\n");
}
int main()
{
int i;
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(du,0,sizeof(du));
memset(head,-1,sizeof(head));
cnt=0;
for(i=0; i<m; i++)
{
scanf("%d %d",&u,&v);
du[u]++;
creat();
}
tp();
}
return 0;
}拓扑排序