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;
}