数据:

/*
99999
3 4
3 1 2 4
2 2 3
2 3 4
*/

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,S=,T=,SSZ=*SZ,one=,INF=0x7FFFFFFF,mod=;
lon n,m,dfn[SSZ],low[SSZ],cnt,tot,bel[SSZ];
bool mp[SSZ][SSZ],ins[SSZ],mk[SSZ],sz[SSZ];
int src[SSZ][SSZ],dep[SSZ],num;
stack<lon> stk;
/*
99999
3 4
3 1 2 4
2 2 3
2 3 4
*/ bool bfs()
{
memset(dep,,sizeof(dep));
queue<int> q;
q.push(S);
dep[S]=;
for(;q.size();)
{
int fr=q.front();
q.pop();
//cout<<fr<<endl;
for(int i=;i<=T;++i)
{
if(src[fr][i]&&!dep[i])
{
dep[i]=dep[fr]+;
q.push(i);
if(i==T)return ;
}
}
}
return ;
} int dinic(int x,int flow)
{
if(x==T)return flow;
else
{
int rem=flow;
for(int i=;i<=T&&rem;++i)
{
if(src[x][i]&&dep[i]==dep[x]+)
{
int tmp=dinic(i,min(rem,src[x][i]));
if(!tmp)dep[i]=;
rem-=tmp;
src[x][i]-=tmp;
src[i][x]+=tmp;
}
}
return flow-rem;
}
} void init()
{
cin>>n>>m;
for(lon i=;i<=n;++i)
{
src[S][i]=;
lon knum;
cin>>knum;
for(lon j=;j<knum;++j)
{
lon id;
cin>>id;
mp[i][id+n]=;
src[i][id+n]=;
}
}
for(int i=;i<=m;++i)src[i+n][T]=;
for(;bfs();)
{
dinic(S,INF);
}
num=n+m;
for(lon i=;i<=n;++i)
{
int ok=;
for(int j=;j<=m;++j)
{
//cout<<i<<" "<<j<<" "<<src[i][j+n]<<" "<<mp[i][j+n]<<endl;
if(src[i][j+n]!=mp[i][j+n])
{
mp[j+n][i]=;
ok=;
}
}
if(!ok)
{
mk[i]=;//not used
++num;
for(int j=;j<=n;++j)
{
mp[j][num]=;
}
mp[num][i]=;
}
//cout<<mk[i]<<endl;
}
for(int i=;i<=m;++i)
{
//cout<<src[i+n][T]<<endl;
if(src[i+n][T]==)
{
sz[i]=;
++num;
for(int j=;j<=m;++j)
{
mp[num][j+n]=;
}
mp[i+n][num]=;
}
}
} void dfs(lon x)
{
dfn[x]=low[x]=++cnt;
stk.push(x);
ins[x]=;
for(lon i=;i<=num;++i)
{
if(mp[x][i])
{
if(!dfn[i])
{
dfs(i);
low[x]=min(low[x],low[i]);
}
else if(ins[i])low[x]=min(low[x],low[i]);
}
}
if(low[x]==dfn[x])
{
++tot;
for(;stk.size();)
{
lon top=stk.top();
stk.pop();
bel[top]=tot;
ins[top]=;
if(top==x)break;
}
}
} void work()
{
for(lon i=;i<=n+m;++i)if(!dfn[i])dfs(i);
for(lon i=;i<=n;++i)
{
vector<lon> ans;
//cout<<bel[i]<<" "<<bel[i+n]<<endl;
for(lon j=;j<=m;++j)
{
//cout<<sz[j+n]<<endl;
if(mp[i][j+n]&&bel[i]==bel[j+n])
{
ans.push_back(j);
}
}
cout<<ans.size();
sort(ans.begin(),ans.end());
for(lon j=;j<ans.size();++j)
{
cout<<" "<<ans[j];
}
cout<<endl;
}
for(lon i=;i<=n;++i)
{
src[S][i]=;
for(lon j=n+;j<=n+m;++j)mp[i][j]=mp[j][i]=src[i][j]=;
}
for(lon i=;i<=m;++i)
{
src[i+n][T]=;
}
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(bel,,sizeof(bel));
memset(mk,,sizeof(mk));
memset(sz,,sizeof(sz));
memset(ins,,sizeof(ins));
memset(mp,,sizeof(mp));
memset(src,,sizeof(src));
for(;stk.size();stk.pop());
cnt=tot=;
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
cin>>casenum;
//cout<<casenum<<endl;
for(int time=;time<=casenum;++time)
//for(lon time=1;cin>>n;++time)
{
//printf("Case #%d:\n",time);
cout<<"Case #"<<time<<":"<<endl;
init();
work();
}
return ;
}

hdoj4685的更多相关文章

随机推荐

  1. MongoDB分片集群原理、搭建及测试详解

    随着技术的发展,目前数据库系统对于海量数据的存储和高效访问海量数据要求越来越高,MongoDB分片机制就是为了解决海量数据的存储和高效海量数据访问而生. MongoDB分片集群由mongos路由进程( ...

  2. Failed to load driver class com.mysql.jdbc.Driver from HikariConfig class classloader sun.misc.Launcher$AppClassLoader@18b4aac2

    1.错误日志 Failed to load driver class com.mysql.jdbc.Driver from HikariConfig class classloader sun.mis ...

  3. java框架之Hibernate(1)-简介及初使用

    简介 hibernate 是一个开源 ORM ( Object / Relationship Mipping ) 框架,它是对象关联关系映射的持久层框架,它对 JDBC 做了轻量级的封装,而我们 ja ...

  4. DOIS 2019 DevOps国际峰会北京站来袭~

    DevOps 国际峰会是国内唯一的国际性 DevOps 技术峰会,由 OSCAR 联盟指导.DevOps 时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈 DevOps 体系与方法.过程与 ...

  5. Asianux 7.3安装Oracle 11.2.0.4单实例体验

    环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [root@ ...

  6. kafka笔记3(生产者)

    创建Kafka生产者: Kafka生产者有3个必选属性: bootstrap.servers   broker地址清单,格式为host:port   ,清单中不必包含所有broker,但至少2个 ke ...

  7. mysql查看当前执行线程_关闭当前的某些线程 show processlist_kill

    每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. 如果您拥有SUPER权限,您 ...

  8. redis解决高并发下脏读问题

    //解决并发情况下卡脏读的问题 protected function BingFa($mobile, $ent_id){ $obj = EnterpriseMembers::getNewMemberC ...

  9. angular+webpack(二)

    上篇文章Angular2开发基础之TSC编译 解决如何使用TSC来编译ng2项目,以及如何解决出现的error.这些点是新手容易忽视的内容, 要熟悉ng开发的工具链,还是需要掌握其中的重点.本篇文章是 ...

  10. K均值

    K-means算法的工作流程 首先,随机确定k个初始点的质心:然后将数据集中的每一个点分配到一个簇中,即为每一个点找到距其最近的质心,并将其分配给该质心所对应的簇:该步完成后,每一个簇的质心更新为该簇 ...