1.反向建图,有利于计算
2.代码:
#include<cstdio> #include<cstring> #include<stdlib.h> #define Max(a,b) ((a)>(b)?(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,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,0,sizeof(level)); 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-13 23:46:15