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
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- rownum 和 rowid
- mybatis配置文件
- +
- whatthef
- leetcode36. Valid Sudoku
- POJ
- PHP connects Hostinger MySQL database
- Oracle的游标使用方法 三种循环
- java多线程学习5,ThreadLocal
- 死锁产生的原因以及避免死锁的算法
- CaysnPrinter安卓平台开发包接口说明文档及打印示例程序
- 数据库入门(增删查改)
- CentOS安装Nginx
- 最长递增子序列