hdoj4685
数据:
/*
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的更多相关文章
随机推荐
- sql server实例内存使用统计
转载于: http://blog.csdn.net/shutao917/article/details/51444424 SQL SERVER内存按存放数据的类型,大概可以分为三类: 1.buffer ...
- spark streaming集成kafka
Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...
- spark streaming集成flume
1. 安装flume flume安装,解压后修改flume_env.sh配置文件,指定java_home即可. cp hdfs jar包到flume lib目录下(否则无法抽取数据到hdfs上): $ ...
- dex2jar反编译dex文件
apk实际是一组文件的压缩包,修改为zip或rar后直接解压可以看到其内部内容,其中classes.dex就是java代码编译后的结果 dex2jar可以实现对该文件的反编译 dex2jar镜像地址: ...
- Redis应用场景说明与部署
Redis简介 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的memcached缓存服务很像,但是red ...
- Redis入门到高可用(十四)—— bitmap
一.初步认识 二.API 1.setbit 2.getbit 3.bitcount 4.bitop 5.bitpos 三.位图使用 四. 使用经验
- PHP中new self()和new static()的区别探究
1.new static()是在PHP5.3版本中引入的新特性. 2.无论是new static()还是new self(),都是new了一个新的对象. 3.这两个方法new出来的对象有什么区别呢,说 ...
- git中设置http代理和取消http代理
设置http代理 git config --global https.proxy https://127.0.0.1:1080 取消http代理git config --global --unset ...
- Python记录14:面向对象编程 类和对象
'''现在主流的编程思想有两种,一种是面向对象,一种是面向过程面向过程编程 核心是过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.最后干什么... 基于该思想编写程序就好比再设计一条流水线, ...
- 【Checkio Exercise】Probably Dice
题目: Probably Dice Battle is full of randomnesses. You should observe randomness in a controlled sett ...