首页 > 其他 > 详细

Reward(toposort)

时间:2014-02-28 08:46:24      阅读:435      评论:0      收藏:0      [点我收藏+]

http://acm.hdu.edu.cn/showproblem.php?pid=2647

bubuko.com,布布扣
#include <stdio.h>
#include <string.h>
#include <queue>
#define LL long long
using namespace std;
int head[10006],cnt=0;
int val[10006];
int in[10006];
int n,m,num;
queue<int>q;
struct node
{
    int u,v;
    int next;
} edge[20010];
void add(int u,int v)
{
    edge[cnt].u = u;
    edge[cnt].v = v;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}
void init()
{
    cnt = 0,num = 0;
    while(!q.empty()) q.pop();
    memset(in,0,sizeof(in));
    memset(head,-1,sizeof(head));
}
void toposort()
{
    for (int i = 1; i <= n; i++)
    {
        if (in[i]==0)
        {
            q.push(i);
            val[i]=888;
        }
    }
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        num++;
        for (int j = head[u]; j!=-1; j=edge[j].next)
        {
            int v = edge[j].v;
            val[v] = val[v] <= val[u]+1? val[u]+1:val[u];
            if (val[v] <= val[u])
            val[v] = val[u]+1;
            in[v]--;
            if(!in[v])
                q.push(v);
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        int u,v;
        for (int i = 0; i < m; i++)
        {
            scanf("%d%d",&u,&v);
            add(v,u);
            in[u]++;
        }
        toposort();
        if(num < n)
        {
            puts("-1");
            continue;
        }
        LL ans = 0;
        for (int i = 1; i <= n; i++)
            ans += val[i];
        printf("%lld\n",ans);
    }
    return 0;
}
View Code

Reward(toposort),布布扣,bubuko.com

Reward(toposort)

原文:http://www.cnblogs.com/lahblogs/p/3571522.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!