对象:有向图(有无权无所谓)
存储方式:邻接表(最好写罢了,空间也比较少)
核心代码:

void topsort(adjgraph g) { int i,j; int visited[maxn]={0}; int st[maxn],top=-1; arcnode *p; for(int i=0;i<g.n;i++)//初始化 g.adjlist[i].count=0; for(i=0;i<g.n;i++)//找到每个顶点vertex的入度 { p=g.adjlist[i].firstarc; while(p!=NULL) { g.adjlist[p->adjvex].count++; p=p->nextarc; } } for(i=0;i<g.n;i++)//度为零的进站 if(g.adjlist[i].count==0) st[++top]=i; while(top>-1) { i=st[top--];//出站 visited[i]++;//标记这个点已被访问 p=g.adjlist[i].firstarc; while(p!=NULL)//以此点i为入度的减一 { j=p->adjvex; g.adjlist[j].count--; if(g.adjlist[j].count==0) st[++top]=j; p=p->nextarc; } } i=0; while(visited[i]&&i<g.n) i++; if(i==g.n)//全部访问 ,即无环 cout<<"YES "; else cout<<"NO "; }
完整试例:

#include<iostream> using namespace std; const int maxn=100; struct arcnode { int adjvex; arcnode *nextarc; }; struct vnode { int count; arcnode *firstarc; }; struct adjgraph { vnode adjlist[maxn]; int n; }; void make_adjgraph(adjgraph &g) { int m; cin>>m; for(int i=0;i<g.n;i++) { g.adjlist[i].firstarc=NULL; } for(int i=0;i<m;i++) { int a ,b; cin>>a>>b; arcnode *p=new arcnode; p->adjvex=b; p->nextarc=g.adjlist[a].firstarc; g.adjlist[a].firstarc=p; } } void topsort(adjgraph g) { int i,j; int visited[maxn]={0}; int st[maxn],top=-1; arcnode *p; for(int i=0;i<g.n;i++)//初始化 g.adjlist[i].count=0; for(i=0;i<g.n;i++)//找到每个顶点vertex的入度 { p=g.adjlist[i].firstarc; while(p!=NULL) { g.adjlist[p->adjvex].count++; p=p->nextarc; } } for(i=0;i<g.n;i++)//度为零的进站 if(g.adjlist[i].count==0) st[++top]=i; while(top>-1) { i=st[top--];//出站 visited[i]++;//标记这个点已被访问 p=g.adjlist[i].firstarc; while(p!=NULL)//以此点i为入度的减一 { j=p->adjvex; g.adjlist[j].count--; if(g.adjlist[j].count==0) st[++top]=j; p=p->nextarc; } } i=0; while(visited[i]&&i<g.n) i++; if(i==g.n)//全部访问 ,无环 cout<<"YES "; else cout<<"NO "; } int main() { adjgraph g; while(cin>>g.n&&g.n) { make_adjgraph(g); topsort(g); } return 0; }
例题地址:http://tk.hustoj.com/problem.php?id=2138