天天看點

P2835 刻錄CD光牒

​​傳送門​​

思路:

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
#define ll long long     
int f[1010];
bool g[210][210];
int n;

void floyd()
{
  for(int k = 1; k <= n; k++)
  {
    for(int j = 1; j <= n; j++)
    {
      for(int i = 1; i <= n; i++)
      {
        if(g[i][k]&&g[k][j])
        g[i][j] = true;
      }
    }
  }
}
int main()
{
  scanf("%d",&n);
  memset(g,false,sizeof(g));
  for(int i = 1; i <= n; i++)
  f[i] = i;
  for(int i = 1; i <= n; i++)
  {
    int x;
    while(scanf("%d",&x) && x)
    {
      g[i][x] = true;
    }
  }
  floyd();
  int ans = 0,cnt;
  for(int i = 1; i <= n; i++)
  for(int j = 1; j <= n; j++)
    if(g[i][j])             
    f[j] = f[i];
  for(int i = 1; i <= n; i++)
    if(f[i] == i)
      ans++;
  printf("%d\n",ans);
}      

繼續閱讀