hrbustoj 1708 許可證 圖論

許可證
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 417(136 users) Total Accepted: 158(115 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

題樣例的解釋:
4 3

1 2
2 3
3 4
4
 
自己的1
1->2;
1->2->3
1->2->3->4

所以他一共可以獲得4種許可證;

首先,用一個二維數組來存圖;再用一個標記數組來記錄該許可證他是否擁有,如果有的話標記 1;再看他有的這張許可證與其他許可證的聯繫;比如樣例中的一號許可證在標記數組中爲 ‘1’,而且由一號許可證得到二號許可證,這裏存圖的二維數組非空(map【1】【2】= 1),就把ans++;

#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int MAXN = 1000;
int vis[MAXN],map[MAXN][MAXN],i,j,m,n,ans;
int dfs(int i)
{
    vis[i] = ++ans;
    for(int k=1;k<=m;k++)
        if(! vis[k] && map[i][k])
        dfs(k);


}
int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        ans = 0;
        memset(vis,0,sizeof(vis));
        memset(map,0,sizeof(map));
        for(int k=0;k<n;k++)
        {
            scanf("%d%d",&i,&j);
            map[i][j] = 1;
        }
        dfs(1);
        printf("%d\n",ans);
    }
}


運行樣例如下;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章