1383:刻录光盘(cdrom)

刻录光盘

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

const int N=205;
int n;
int mapp[N][N];
int p[N];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=1;i<=n;i++){
        int x;
        while(scanf("%d",&x)&&x!=0){
            mapp[i][x]=1;//mapp[i][x]=1表示i与x是连通的,有向边
        }
    }
 
	//floyd算法这种用法是真的nice
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                mapp[i][j]=mapp[i][j]||(mapp[i][k]&&mapp[k][j]);
 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(mapp[i][j])
                p[j]=p[i];//p[i]是p[j]的父节点

    int cnt=0;
    for(int i=1;i<=n;i++)
        if(p[i]==i)
            cnt++;

    printf("%d\n",cnt);
    return 0;
}
posted @ 2021-10-30 12:47  Rekord  阅读(569)  评论(0编辑  收藏  举报