Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2468540
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类: C/C++

2010-03-20 12:12:04

#include <iostream>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;

#define SIZE 100010

/*自定义比较函数,这里实现的是最小优先级队列*/
struct less_cmp
{
    bool operator()(const int &a, const int &b)
    {
        return a > b;
    }
};

vector<int> Vec[SIZE];

/* 初始化方式 */
priority_queue < int, vector<int>, less_cmp > Que;
int n, k, degree[SIZE];

void clear()
{
    memset(degree, 0, sizeof(degree));
}

int main(int argc, char *argv[])
{
    int i, beg, end;

    while (1)
    {
        scanf("%d %d", &n, &k);
        if (0 == n && 0 == k)
            break;

        for (i=0 ; i<k ; i++)
        {
            scanf("%d %d", &beg, &end);
            Vec[beg].push_back(end);
            degree[end]++;
        }

        for (i=1 ; i<=n ; i++)
        {
            if (0 == degree[i])
                Que.push(i);
        }

        int node;
        vector<int>::iterator iter_beg;
        vector<int>::iterator iter_end;
        printf("ORDER:");
        while (!Que.empty())
        {
            node = Que.top();
            Que.pop();
            printf(" %d", node);
            iter_end = Vec[node].end();
            for (iter_beg = Vec[node].begin() ; iter_beg != iter_end ; iter_beg++)
            {
                degree[*iter_beg]--;
                if (0 == degree[*iter_beg])
                    Que.push(*iter_beg);
            }
            Vec[node].clear();
        }
        printf("\n");

        clear();
    }
}


阅读(1938) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~