Hust oj 1708 许可证(dfs)

许可证
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 305(82 users)Total Accepted: 108(71 users)Rating: Special Judge: No
Description

mac最近开了一家麻辣面馆,但是开面馆也不是件容易的事情,为了让广大客户相信自己面馆的权威性,mac想尽可能的获得多的许可证,但是发证的单位也不是随便就给发证的,通常情况下,发证的单位要看看店内是否有其它的相关证明,如果有才给发证。例如:mac要想获得美食局的证那么他就必须先获得卫生局的证件。现在mac手里只有一个房产证,我们将其编号为1,mac想知道他最多可以获得多少证件。

Input

多组测试数据。

对于每组测试数据,第一行输入两个整数n,m(0<n, m<=100),分别表示证件的种数(编号1~n),和已知的不同证件之间的约束的关系数。

接下来的m行,每行两个正数a,b(1<=a,b<=n)表示如果mac有证件a,就可以获得证件b。

Output

对于每组测试数据,输出一个整数表示mac最多可以获得的证件的种类数(包括一开始就有的1号证件)。

Sample Input

4 3

1 2

2 3

3 4

Sample Output

4

就是从1开始dfs,只要能走到的点都说明能拿到许可证,最后扫一遍vis数组就行了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 305;
const int Inf = 0x3f3f3f;
int map[maxn][maxn];
int vis[maxn];
int n,m;
int x,y;

void dfs(int x)
{
    if(vis[x])
        return ;
    vis[x] = 1;
    for(int i=1;i<=n;i++)
    {
        if(map[x][i]==1 && !vis[i])
                dfs(i);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));

        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            map[x][y] = 1;
        }
        dfs(1);
        int cnt = 0;
        for(int i=1;i<=n;i++)
        {
            if(vis[i])
                cnt++;
        }
        printf("%d\n",cnt);
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值