// DAY20.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
using namespace std;
#define max 100
typedef struct arc
{
int ad;
struct arc *next;
}arc;
typedef struct vnode
{
int data;
arc *first;
int count;
}vnode;
typedef struct
{
vnode v[100];
int n,e;
}graph;
void createg(graph &g)
{
int i;
cout<<"请输入顶点个数,边的条数"<<endl;
cin>>g.n>>g.e;
for(i=0;i<g.n;i++)
{
g.v[i].first=NULL;
g.v[i].data=i;
g.v[i].count=0;
}
for(i=0;i<g.e;i++)
{
int v1,v2;
cout<<"请输入顶点"<<endl;
cin>>v1>>v2;
arc *a=new arc;
a->ad=v2;
g.v[v2].count++;
a->next=g.v[v1].first;
g.v[v1].first=a;
}
}
void topsort(graph g)
{
int i,n=0;
int stack[100],top=-1;
for(i=0;i<g.n;i++)
{
if(g.v[i].count==0)
{
stack[++top]=g.v[i].data;
}
}
while(top!=-1)
{
i=stack[top];
cout<<stack[top--]<<' ';
n++;
arc *p;
p=g.v[i].first;
while(p)
{
int j=p->ad;
g.v[j].count--;
if(g.v[j].count==0)
{
stack[++top]=j;
}
p=p->next;
}
}
if(n==g.n)
{
cout<<"该图AOV网"<<endl;
}
else
{
cout<<"该图不是AOV网"<<endl;
}
}
int main(int argc, char* argv[])
{
graph g;
createg(g);
topsort(g);
return 0;
}
判断是否存在回路的思想:拓扑排序每次选折入度为0的点进行删除边,如果是回路,找不到没有入度为0的点。图形上的解释为:每个点都有前驱,不知道该从哪里入手