现在的位置: 首页 > 综合 > 正文

hdu 2647 Reward

2018年12月30日 ⁄ 综合 ⁄ 共 680字 ⁄ 字号 评论关闭

逆向拓扑排序

 

 

 

#include<stdio.h>
#include<stack>
using namespace std;
int n;
struct op
{
    int son;
    struct op *next;
}*p[10005];
int link[10005],f[10005];
void insert(int a,int b)
{
    op *q=new op;
    q->son=b;
    q->next=p[a];
    p[a]=q;
}
void tuopusort()
{
    int num=0,sum=0;
    stack<int>Q;
    for(int i=1;i<=n;i++)
        if(link[i]==0)
        {Q.push(i);f[i]=888;}
        while(!Q.empty())
        {
            num++;
            int u=Q.top();
            Q.pop();
            sum+=f[u];
            for(op *j=p[u];j;j=j->next)
            {
                if(--link[j->son]==0)
                    Q.push(j->son);
                if(f[j->son]<=f[u])
                    f[j->son]=f[u]+1;
            }
        }
        if(num!=n)puts("-1");//有环,矛盾
        else printf("%d\n",sum);        
}
int main()
{
    int i,m,x,y;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<=n;i++)
        {
            p[i]=NULL;
            f[i]=0;
            link[i]=0;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
                insert(y,x);
                link[x]++;
         }                    
       tuopusort();
    }
    return 0;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.