CodeForces 170 A. Learning Languages //搜索

来源:互联网 发布:心动网络青春篮球官网 编辑:程序博客网 时间:2024/05/29 12:17

  这道题出看思路很简单,就是将能够沟通的人合并都一起,但是判断两个人能不能沟通有点麻烦,所以在实现上出了点问题,一直没解决。

  我想的是先开个二维数组来直接储存信息(行储存该人会的语言,列储存的是该人),然后在搜索的同时标记,可是感觉很难实现。看来下别人的代码,根据一个二维数组,来建一个人与人之间能不能交流的二维数组,这样直接就可以遍历来。

下面是代码:

#include<stdio.h>#include<string.h>#define MAXN 105int map[MAXN][MAXN],record[MAXN][MAXN];int visit[MAXN];int n,m,cnt;void dfs(int v){    if(!visit[v])    {       visit[v]=1;       for(int i=1;i<=n;++i) if(map[v][i]) dfs(i);    }}int main(){    int flag;    //freopen("a.txt","r",stdin);    //freopen("b.txt","w",stdout);    while(scanf("%d%d",&n,&m)!=EOF)    {        cnt=0;        memset(map,0,sizeof(map));        memset(visit,0,sizeof(visit));        memset(record,0,sizeof(record));        flag=0;        for(int i=1;i<=n;++i)        {            int N,t;            scanf("%d",&N);            if(N==0) ++flag;            for(int j=1;j<=N;++j)            {                scanf("%d",&t);                record[i][t]=1;            }        }        if(flag==n) printf("%d\n",flag);        else        {            // tag who and who can communicate with each other            //it can be more quick!            for(int i=1;i<=n;++i)            {                for(int j=1;j<=n;++j)                {                    for(int k=1;k<=m;++k)                    {                        if(record[i][k]&&record[j][k]) map[i][j]=1;                    }                }            }            // dfs the map!            for(int i=1;i<=n;++i)            {                if(!visit[i])                {                    ++cnt;                    dfs(i);                }            }            printf("%d\n",cnt-1);        }    }    //fclose(stdin);    //fclose(stdout);    return 0;}

 写来这道题,感觉自己有多垃圾来。。囧!

原创粉丝点击