标签:topology
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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:topology
原文地址:http://blog.csdn.net/xky1306102chenhong/article/details/47185671