标签:
2 1 1 2 2 2 1 2 2 1
1777 -1
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define maxn 11000 using namespace std; char map[maxn]; int indu[maxn]; int head[maxn], cnt; int n, m; int a[maxn]; struct node { int u, v, next; }; node edge[110000]; void init(){ cnt = 0; memset(head, -1, sizeof(head)); memset(indu, 0, sizeof(indu)); for(int i = 1; i <= n; ++i)//所有人的工资一开始都为888 a[i] = 888; } void add(int u, int v){ edge[cnt] = {u, v, head[u]}; head[u] = cnt++; } void input(){ while(m--){ int a, b; scanf("%d%d", &b, &a); add(a, b);//注意是反向的, wa了一次 indu[b]++; } } void topsort(){ queue<int >q; int sum = 0; int ans = 0; for(int i = 1; i <= n; ++i){ if(!indu[i]){ q.push(i); ans++; } } while(!q.empty()){ int u = q.front(); sum += a[u]; q.pop(); for(int i = head[u]; i != -1; i = edge[i].next){ int v = edge[i].v; indu[v]--; if(!indu[v]){ q.push(v); a[v] = a[u] + 1;//保证后一个人的工资比前一个人的工资高 ans++; } } } if(ans == n) printf("%d\n", sum); else printf("-1\n"); } int main (){ while(scanf("%d%d", &n, &m) != EOF){ init(); input(); topsort(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/47659891