hdu 2647 Reward(拓扑排序)

来源:互联网 发布:雪人企业版是什么软件 编辑:程序博客网 时间:2024/04/19 20:33

1.反向建图,有利于计算

2.代码:

#include<cstdio>#include<cstring>#include<stdlib.h>#define Max(a,b) ((a)>(b)?(a):(b))using namespace std;typedef struct ArcNode{    int adjvex;    struct ArcNode * nextarc;} ArcNode;typedef struct VNode{    int vertex;    ArcNode * firstarc;} VNode;int n,m;int Stack[10005];VNode V[10005];int top;int in[10005];int level[10005];void Free(){    ArcNode * p;    ArcNode * q;    for(int i=1;i<=n;i++)    {        p=V[i].firstarc;        while(p!=NULL)        {            q=p->nextarc;            free(p);            p=q;        }    }}int main(){    int a,b;    ArcNode * p;    while(scanf("%d%d",&n,&m)==2)    {        top=0;        memset(Stack,0,sizeof(Stack));        for(int i=1; i<=n; i++)        {            V[i].vertex=i;            V[i].firstarc=NULL;            level[i]=888;            in[i]=0;        }        for(int i=1; i<=m; i++)        {            scanf("%d%d",&a,&b);            in[a]++;            p=(ArcNode *)malloc(sizeof(ArcNode));            p->adjvex=a;            p->nextarc=V[b].firstarc;            V[b].firstarc=p;        }        memset(level,0,sizeof(level));        for(int i=1; i<=n; i++)        {            if(in[i]==0)            {                Stack[++top]=V[i].vertex;                level[i]=888;            }        }        int cnt=0;        while(top!=0)        {            int j=Stack[top--];            cnt++;            for(p=V[j].firstarc; p; p=p->nextarc)            {                int k=p->adjvex;                in[k]--;                level[k]=Max(level[j]+1,level[k]);                if(in[k]==0)                {                    Stack[++top]=k;                    level[k]=Max(level[j]+1,level[k]);                }            }        }        if(cnt==n)        {            int ans=0;            for(int i=1;i<=n;i++)            {                ans+=(level[i]);            }            printf("%d\n",ans);        }        else            printf("-1\n");        Free();    }    return 0;}

1 0
原创粉丝点击