图—拓扑排序

对象:有向图(有无权无所谓)

存储方式:邻接表(最好写罢了,空间也比较少)

核心代码:

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\n";
    else
       cout<<"NO\n"; 
    
}
View Code

完整试例:

#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\n";
    else
       cout<<"NO\n"; 
    
}
int main()
{
    adjgraph g;
    while(cin>>g.n&&g.n)
    {
      make_adjgraph(g);
      topsort(g);
    }
    return 0;
}
View Code

例题地址:http://tk.hustoj.com/problem.php?id=2138

 

posted @ 2018-11-21 19:24  shenyuli  阅读(180)  评论(0编辑  收藏  举报
Live2D