许可证 | ||||||
| ||||||
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);
}
}
运行样例如下;