【数据结构】SJTU OJ 1237

http://acm.sjtu.edu.cn/OnlineJudge/problem/1237

烦死了烦死了

应该按照年份考虑的,自己做的时候又忘记减入度,真是活该。快复习!!

#include <iostream>

using namespace std;
int begin=1,tail=0,Q[100001]={0},cnt=0,tmp=0,res=0,de;
int begin_=1,tail_=0,Q_[100001]={0};
void enQueue_(int x)
{
    ++tail_;
    Q_[tail_]=x;
}
int result[101];
void enQueue(int x)
{
    ++tail;
    Q[tail]=x;
}
class graph
{
private:
    int vSize,eSize;
    struct edgeNode{
        int weight;
        int end;
        edgeNode*next;
        edgeNode(int e,int w,edgeNode *n=NULL)
        {
            weight=w;
            end = e;
            next=n;
        }
    };
    struct verNode{
        int ver;
        edgeNode*head;
        verNode(edgeNode*h=NULL)
        {
            head = h;
        }
    };
    verNode*verList;
public:
    graph(int size)
    {
        vSize =size;
        eSize =0;
        verList = new verNode[vSize+1];
        for(int i=1;i<=vSize;++i)
        {
            verList[i].ver =i;
        }
    }
    void insert(int u,int v,int weight=1)
    {
        verList[u].head = new edgeNode(v,weight,verList[u].head);
        eSize++;
    }
    int topSort()
    {
        int *inDegrees=new int[vSize+1];
        for(int i=1;i<=vSize;++i)
            inDegrees[i]=0;
        for(int i=1;i<=vSize;++i)
        {
            edgeNode*p=verList[i].head;
            while(p!=NULL)
            {
                ++inDegrees[p->end];
                p=p->next;
            }
        }
        bool *marked=new bool[vSize+1];for(int j=1;j<=vSize;++j) marked[j]=false;
        for(int i=1;i<=vSize;++i)
        {
            if(inDegrees[i]==0)
            {
                enQueue(i);
            }
        }

        while(begin<=tail)
        {
            if(begin<=tail)++tmp;
            while(begin<=tail)
            {
                de =Q[begin];begin++;
                marked[de]=true;
                edgeNode*p=verList[de].head;
                while(p!=NULL){
                    if(marked[p->end]==false)
                    {
                        if(--inDegrees[p->end]==0)enQueue_(p->end);
                    }
                    p=p->next;
                }
            }
        if(begin_<=tail_) tmp++;
        while(begin_<=tail_)
        {
            de = Q_[begin_];begin_++;
            marked[de]=true;
            edgeNode*p=verList[de].head;
            while(p!=NULL){
                if(marked[p->end]==false)
                {
                   if(--inDegrees[p->end]==0) enQueue(p->end);
                  //  marked[p->end]=true;
                }
                p=p->next;
            }
        }
        }
        return tmp;
    }
};
int main()
{
    int n,m,u,v;
    cin>>n>>m;
    graph g(n);
    for(int i=0;i<m;++i)
    {
        cin>>u>>v;
        g.insert(u,v);
    }
    g.topSort();
    cout<<tmp;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值