许可证
Time Limit: 1000 MS Memory Limit: 32768 K
Description
mac最近开了一家麻辣面馆,但是开面馆也不是件容易的事情,为了让广大客户相信自己面馆的权威性,mac想尽可能的获得多的许可证,但是发证的单位也不是随便就给发证的,通常情况下,发证的单位要看看店内是否有其它的相关证明,如果有才给发证。例如:mac要想获得美食局的证那么他就必须先获得卫生局的证件。现在mac手里只有一个房产证,我们将其编号为1,mac想知道他最多可以获得多少证件。
Input
多组测试数据。
对于每组测试数据,第一行输入两个整数n,m(0
Output
对于每组测试数据,输出一个整数表示mac最多可以获得的证件的种类数(包括一开始就有的1号证件)。
Sample Input
4 3
1 2
2 3
3 4
Sample Output
4
Author
周洲 @hrbust
题意
RT
思路
Floyd来一下,类似于闭包传递的一个题目。
简单说就是看从许可证1,到各个许可证之间有没有可以到达的路径,有的说许可证数目++。
坑点
有一定几率有人会忽略最初有一个许可证的条件。
AC代码
#include<bits/stdc++.h>
using namespace std;
int Map[1006][1006];
void solve(void)
{
int n,m;
while(cin>>n>>m)
{
memset(Map,-1,sizeof(Map));
for(int i = 1 ; i <= m; i++){
int from,to;
cin>>from>>to;
Map[from][to] = 1;
}
for(int k = 1 ; k <= n ; k++ ){
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
if(Map[i][k]!=-1&&Map[k][j]!=-1) Map[i][j] = 1;
}
}
}
int ans = 1;
///最开始有一个许可证,从2开始搜索有没有路径就好
for(int i = 2 ; i <= n ; i++) if(Map[1][i] == 1) ans++;
cout<<ans<<endl;
}
}
int main(void)
{
solve();
return 0;
}