http://acm.hdu.edu.cn/showproblem.php?pid=2647
#include <stdio.h> #include <string.h> #include <queue> #define LL long long using namespace std; int head[10006],cnt=0; int val[10006]; int in[10006]; int n,m,num; queue<int>q; struct node { int u,v; int next; } edge[20010]; void add(int u,int v) { edge[cnt].u = u; edge[cnt].v = v; edge[cnt].next = head[u]; head[u] = cnt++; } void init() { cnt = 0,num = 0; while(!q.empty()) q.pop(); memset(in,0,sizeof(in)); memset(head,-1,sizeof(head)); } void toposort() { for (int i = 1; i <= n; i++) { if (in[i]==0) { q.push(i); val[i]=888; } } while(!q.empty()) { int u = q.front(); q.pop(); num++; for (int j = head[u]; j!=-1; j=edge[j].next) { int v = edge[j].v; val[v] = val[v] <= val[u]+1? val[u]+1:val[u]; if (val[v] <= val[u]) val[v] = val[u]+1; in[v]--; if(!in[v]) q.push(v); } } } int main() { while(~scanf("%d%d",&n,&m)) { init(); int u,v; for (int i = 0; i < m; i++) { scanf("%d%d",&u,&v); add(v,u); in[u]++; } toposort(); if(num < n) { puts("-1"); continue; } LL ans = 0; for (int i = 1; i <= n; i++) ans += val[i]; printf("%lld\n",ans); } return 0; }
Reward(toposort),布布扣,bubuko.com
原文:http://www.cnblogs.com/lahblogs/p/3571522.html