注意顺序
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