POJ

来源:互联网 发布:诺一网络水军 编辑:程序博客网 时间:2024/04/20 14:51



点击打开链接


题意:  给你N个人,然后m个分组。

每个人可能位于多个分组。

然后编号0的认识非典。和他一组的都有病,

求你找到所有有病的人。

题解:

 这题我写的好麻烦呀。。。我用的广搜。从0为起点。

 然后记录每个人加入的群组分别是多少。然后依次找到有病的人,把他们的群组依次加入队列。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>#include<queue>#include<vector>using namespace std;int n,m,p;int v[30005];int g[505];int a[505][30005];int len [505];vector<int>vec[30005];int main(){    while(scanf("%d %d",&n,&m)&&(n+m)){        for(int i=0;i<n;++i) vec[i].clear();        memset(v,0,sizeof(v));        memset(g,0,sizeof(g));        for(int i=0;i<m;++i){            scanf("%d",&p);len[i]=p;            for(int j=0;j<p;++j){                scanf("%d",&a[i][j]);vec[a[i][j]].push_back(i);            }        }        queue<int>que;        for(int i=0;i<vec[0].size();++i)            que.push(vec[0][i]),g[vec[0][i]]=1;        v[0]=1;int ans=0;        while(!que.empty()){            int t=que.front();//printf("%d~~\n",t);            que.pop();            for(int i=0;i<len[t];++i){                if(!v[a[t][i]]){                    v[a[t][i]]=1;                    ans++;                    for(int j=0;j<vec[a[t][i]].size();++j){                        if(!g[vec[a[t][i]][j]]) g[vec[a[t][i]][j]]=1,que.push(vec[a[t][i]][j]);                    }                }            }        }        printf("%d\n",ans+1);    }    return 0;}


0 0