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的更多相关文章
随机推荐
- online ddl与pt-osc详解
Ⅰ.背景 优化sql的过程中发现表上少一个索引,直接加一个?会不会hang住?不加?sql又跑不好,由此引出一个问题--ddl操作怎么做? Ⅱ.闲扯三两句 5.6版本之前的MySQL创建索引不支持on ...
- 表驱动方法(Table-Driven Methods)
表驱动方法(Table-Driven Methods) - winner_0715 - 博客园 https://www.cnblogs.com/winner-0715/p/9382048.html W ...
- 使用jsonp请求本地json文件
使用jsonp解决请求本地文件跨域问题 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- jquery批量提交表单值 和批量设置表单值
$('#frmCustomerConfirmCar').find('[name]').each(function () { var type = $(this)[0].nodeName.toLower ...
- git pull 冲突拉取不到新的代码
本地文件已经有冲突或者在pull的过程中拉取的文件和本地文件冲突时,拉取不到新的代码,git pull出现报错,如下: 这个时候,如果你有两种选择,如果你需要这些改动,那个你就需要手动解决冲突,然后a ...
- DataCommand和DataAdapter
SqlDataReader 高效,功能弱,只读访问SqlDataAdapter 强大,要求资源也大一点 SqlDataReader 只能在保持跟数据库连接的状态下才可以读取... SqlDataAda ...
- Scala 偏函数
如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常,这样的函数就是偏函数(顾名思异就是这个函数只处理传入来的部分参数). 偏函数是个特质其的类型为Pa ...
- win10忘记开机密码无法进入桌面
第一种: 电脑用微软账户登录,但密码始终不正确. 登陆这个网址 https://account.live.com/password/reset 按照提示的操作利用之前注册信息一步步重设密码 最后 ...
- 盒子布局、标签特性display、浮动、定位position
盒子模型布局: 盒子模型:每个标签都是一个盒子 盒子在页面显示在大小是:自身宽度+边框+边距(内边框+外边距) 如果一个盒子设置了边框,则边框需要被加两遍.若果设置了边距则内外边距根据设置情况要被加两 ...
- Linux configure,make,make install
https://www.cnblogs.com/tinywan/p/7230039.html https://www.sohu.com/a/191735643_505857 https://blog. ...