奖金(类拓扑排序)

来源:互联网 发布:数据采集系统解决方案 编辑:程序博客网 时间:2024/05/01 10:54

思路:将有要求的人入度增加,每次遍历所有点,将入度为0的点挑出来,记录在一个数组中,最后在删除其出度,每轮循环发工资钱数加1便可以保证总工资最少了。

#include <cstdio>#include <iostream>using namespace std;int r[100000],c[100000][1000],sum=0,d[1000000];int main(){    int n,m;    //freopen("reward.in","r",stdin);     //freopen("reward.out","w",stdout);    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)     {        int x,y;        scanf("%d%d",&y,&x);        c[x][++c[x][0]]=y;        r[y]++;     }    int n1=n;     int q=100;    while(n1>=1)    {     int cnt=0;     int j;         for(j=1;j<=n;j++)         if(r[j]==0)          {            cnt++;            d[cnt]=j;            n1--;            sum+=q;           r[j]=1e7;          }        if(cnt==0) {printf("Poor Xed");return 0;}       for(int i=1;i<=cnt;i++)        {            int x=d[i];            for(j=1;j<=c[x][0];j++)             r[c[x][j]]--;        }       q+=1;    }    printf("%d",sum);    return 0;}
0 0
原创粉丝点击