图结构练习——判断给定图是否存在合法拓扑序列

来源:互联网 发布:平面设计用什么软件 编辑:程序博客网 时间:2024/05/14 19:43

题目描述

 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。

输入

 输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
 

输出

 若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
 

示例输入

1 02 21 22 1

示例输出

YESNO

提示



#include <iostream>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct arcnode//表结点;
{
    int adj;
    struct arcnode *next;
}arcnode;
typedef struct vnode//头结点;
{
    int data;
    arcnode *first;
}adjlist[10];
typedef struct//表结构;
{
    adjlist a;
    int vn,an;
}ALG;
int n,m,i,j;
int indegree[10];//记录每个节点的入度;
void create(ALG &g)//建立有向图的邻接表;
{
    int v1,v2;
    arcnode *p;
    g.an=m;
    g.vn=n;
    for(i=1;i<=g.vn;i++)
        g.a[i].first=NULL;//头结点清空;
    for(i=1;i<=g.an;i++)
    {
        scanf("%d%d",&v1,&v2);
        p=new arcnode;
        p->adj=v2;
        indegree[v2]++;
        p->next=g.a[v1].first;
        g.a[v1].first=p;
    }
}
void topo(ALG &g)//判断图是否满足拓扑排序;
{
    int k;
    arcnode *p;
    stack<int>s;
    for(i=1;i<=n;i++)
        if(!indegree[i])//入度为零的结点入栈;
        s.push(i);
    int count=0;//记录出栈元素的个数,最后判断是否满足拓扑排序;
    while(!s.empty())
    {
        j=s.top();
        s.pop();
        count++;//统计栈内有多少个元素;
        for(p=g.a[j].first;p;p=p->next)//删除所有以j为起点的边;
        {
            k=p->adj;
            if(!(--indegree[k]))//将新入度为零的结点入栈;
                s.push(k);
        }
    }
    if(count<n)//出栈元素少于结点个数,说明存在原图有环;
        printf("NO\n");
    else
    printf("YES\n");
}
int main()
{
    ALG g;
    while(~scanf("%d%d",&n,&m))
    {
        memset(indegree,0,sizeof(indegree));//元素出度的初始化;
        create(g);
        topo(g);
    }
    return 0;
}




#include <iostream>
#include<cstdio>
#include<queue>
using namespace std;
#include<cstring>
#include<algorithm>
int map[20][20],in[15],vis[15];
int main()
{
    int n,m;
    int i,j,k;
    while(cin>>n>>m)
    {
      memset(in,0,sizeof(in));
      memset(map,0,sizeof(map));
      memset(vis,0,sizeof(vis));
      while(m--)
      {
      int v,u;
      cin>>u>>v;
      if(!map[u][v])
           in[v]++,map[u][v]=1;
      }


      for(k=0;k<n;k++){
       for(i=1;i<=n;i++)
       if(!in[i]&&!vis[i]){
         vis[i]=1;
         for(j=1;j<=n;j++){
         if(map[i][j])
          map[i][j]=0,in[j]--;
         }
         break;
       }
       if(i>n)
        break;
      }
      if(k<n){
      cout<<"NO\n";
      }
      else
      cout<<"YES\n";


    }


}

0 0
原创粉丝点击