jQuery火箭图标返回顶部代码

SDUT 2140 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

 

数据结构实验之图论十:判断给定图是否存在合法拓扑序列

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

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

Input

 输入包含多组,每组格式如下。

第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)

后面m行每行两个整数a b,表示从a到b有一条有向边。

 

Output

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

 

Sample Input

1 0
2 2
1 2
2 1

Sample Output

YES
NO

提示:该题让你判断这个序列是否存在合法的拓扑序列,而拓扑序列是无环图,如果此图有环就输出NO。

代码实现如下(g++):
#include <bits/stdc++.h>

using namespace std;

int Map[110][110];
int ind[110];
int sum,n,m;

void topu()
{
    int c=0;
    queue<int>t;
    for(int i=1;i<=n;i++)
    {
        if(ind[i]==0)//如果该点入度为0,数据的开头入度必为0,将其入队
        {
            t.push(i);
            c++;
        }
    }
    while(!t.empty())
    {
        int s=t.front();
        t.pop();
        for(int i=1;i<=n;i++)
        {
            if(Map[s][i]==1)
            {
                ind[i]--;
                if(ind[i]==0)//判断有几个入度为1的,并计数,入队
                {
                 t.push(i);
                 c++;
                 }
            }
        }
    }
    if(c!=n)//最后判断计的数和结点数是否相同,就是判断是不是除了开头其他结点的入度都为1,就无环。
    printf("NO\n");
    else
    printf("YES\n");
}

int main()
{
    int a,b,i;
    while(~scanf("%d %d",&n,&m))
    {
        memset(Map,0,sizeof(Map));
        memset(ind,0,sizeof(ind));
        for(i=0;i<m;i++)
        {
            scanf("%d %d",&a,&b);
            Map[a][b]=1;
            ind[b]++;//将b点入度加一
        }
        topu();
    }
    return 0;
}


/***************************************************
Result: Accepted
Take time: 0ms
Take Memory: 244KB
****************************************************/

 

posted @ 2018-08-20 20:17  孑丶然  阅读(445)  评论(0编辑  收藏  举报
Live2D