hdu 2647 Reward

来源:互联网 发布:如何关闭mac日历广告 编辑:程序博客网 时间:2024/05/23 19:05

题意:给出n对员工需求,每队包含两个员工编号,要求前者奖金大于后者,求所有员工的奖金数;

思路:拓扑排序判定有无环;

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,m;struct node{    int du;    node *next;}q[500010];int topo(){    int i,j,k=0;//k记录排好序的点的个数    int num,sum=0;    int temp=888;    node *p;    int *shu=new int[500010];    while(1)    {        num=0;        memset(shu,0,sizeof(shu));        for(i=1;i<=n;i++)        {            if(q[i].du==-1) continue;            if(q[i].du==0)            {                shu[num++]=i;//记录当前度数为0的点                q[i].du=-1;//已排好序,标记掉                k++;            }        }        if(num==0&&k<=n) return -1;        sum+=temp*num;        if(k==n) break;//排序完成,结束        for(i=0;i<num;i++)        {            p=q[shu[i]].next;            while(p)            {                q[p->du].du--;//相邻的点度数减1                p=p->next;            }        }        temp++;    }    return sum;}int main(){    int a,b,i,j,k;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<=n;i++)        {            q[i].du=0;            q[i].next=NULL;        }        for(i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            q[b].du++;            node *t=new node;//反向建边            t->du=a;            t->next=q[b].next;            q[b].next=t;        }        printf("%d\n",topo());    }    return 0;}


0 0
原创粉丝点击