hdu 2647拓扑排序 容器

#include<stdio.h>
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
#define  N  11000
int n,m,sum;
int indegree[N],value[N];
vector<int>now[N];
int Max(int a,int b) {
return a>b?a:b;
}
int find() {
       queue<int>q;
  int i,cur,f;
  for(i=1;i<=n;i++)
if(indegree[i]==0) {
value[i]=888;
q.push(i);
}
f=n;
while(!q.empty()) {
cur=q.front();
q.pop();
f--;
for(i=0;i<now[cur].size();i++) {
        value[now[cur][i]]=Max(value[cur]+1,value[now[cur][i]]);
if(--indegree[now[cur][i]]==0)
q.push(now[cur][i]);
}
}
if(f==0)
return 0;
return 1;
}
int main() {
int i,a,b;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=1;i<=n;i++)
now[i].clear();
memset(indegree,0,sizeof(indegree));
memset(value,0,sizeof(value));
while(m--) {
scanf("%d%d",&a,&b);
    indegree[a]++;
now[b].push_back(a);
}
if(find()) {
printf("-1 ");
continue;
}
sum=0;
for(i=1;i<=n;i++)
sum+=value[i];
printf("%d ",sum);
}
return 0;
}
原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410879.html