1. Reverse mapping is useful for calculating
2. Code:
#include <cstdio> #include <cstring> #include <stdlib.h> #define MAX (b) ((a) > (c)? ( A):(B)) using namespace std;typedef struct arcnode{int adjvex; struct Arcnode * NEXTARC;} arcnode;typedef struct vnode{int vertex; Arcnode * FIRSTARC;} Vnode;int N,m;int stack[10005]; Vnode v[10005];int top;int in[10005];int level[10005];void free () {Arcnode * p; Arcnode * q; for (int i=1;i<=n;i++) {P=v[i].firstarc; while (p!=null) {q=p->nextarc; Free (p); p=q; }}}int Main () {int a A, B; Arcnode * p; while (scanf ("%d%d", &n,&m) ==2) {top=0; memset (stack,0,sizeof (Stack)); for (int i=1; i<=n; i++) {v[i].vertex=i; V[i].firstarc=null; level[i]=888; in[i]=0; } for (int i=1; i<=m; i++) {scanf ("%d%d", &a,&b); in[a]++; p= (Arcnode *) malloc (sizeof (Arcnode)); p->adjvex=a; p->nextarc=v[b].firstarc; V[b].firstarc=p; } memset (Level) (level,0,sizeof); for (int i=1; i<=n; i++) {if (in[i]==0) {Stack[++top]=v[i].vertex; level[i]=888; }} int cnt=0; while (top!=0) {int j=stack[top--]; cnt++; for (P=V[J].FIRSTARC; p; p=p->nextarc) {int k=p->adjvex; in[k]--; Level[k]=max (Level[j]+1,level[k]); if (in[k]==0) {stack[++top]=k; Level[k]=max (Level[j]+1,level[k]); }}} if (cnt==n) {int ans=0; for (int i=1;i<=n;i++) {ans+= (level[i]); } printf ("%d\n", ans); } else printf (" -1\n"); Free (); } return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
HDU 2647 Reward (topological sort)