注意顺序
2 1 1 2 2 2 1 2 2 1
1777 -1
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <limits.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <deque>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define MAXN 10011
int money[MAXN];
int head[MAXN];
int into[MAXN];
struct node{
int to;
int next;
}edge[20010];
int main(){
int n,m;
int i,j;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;i++){
money[i] = 888;
}
memset(into,0,sizeof(into));
memset(head,-1,sizeof(head));
int k = 0;
while(m--){
scanf("%d%d",&j,&i);
edge[k].to = j;
edge[k].next = head[i];
head[i] = k++;
into[j]++;
}
queue<int>t;
for(i=1;i<=n;i++){
if(into[i] == 0){
t.push(i);
}
}
int num = 0;
int ans = 0;
while(!t.empty()){
int u = t.front();
ans+=money[u];
t.pop();
num++;
for(k=head[u];k!=-1;k=edge[k].next){
if(--into[edge[k].to] == 0){//--的位置注意
t.push(edge[k].to);
money[edge[k].to] = money[u] + 1;
}
//t.push(edge[k].to);
//money[edge[k].to] = money[u] + 1;
}
}
if(num != n){
ans = -1;
}
printf("%d\n",ans);
}
return 0;
}
原文地址:http://blog.csdn.net/zcr_7/article/details/39900091