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的更多相关文章
随机推荐
- Elasticsearch学习笔记(三)聚合分析Agg
一.设置fielddata PUT /index/_mapping/type { "properties":{ "fieldName" ...
- vue-cli脚手架
cnpm i vue-cli -g //npm 安装报错,原因不明,可能是我改过东西的原因,但是cnpm可以安装 命令行进入要新建的vue的目录执行 C:\Users\76912\Videos\v ...
- 外星人入侵——安装Pygame
本文以win10和Python3为例来介绍如何安装Pygame. 安装Pygame需要使用pip,我们首先检查pip是否已被安装. 打开一个终端窗口,并执行如下命令 C:\Users\hys>p ...
- python练习题-day10
1.继续整理函数相关知识点,写博客. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def fun(*args): sum=0 for i in args: sum+=i return ...
- C#基础加强(8)之委托和事件
委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...
- mysql 字段唯一性问题
ALTER TABLE tb ADD unique (name);
- 41A
#include <stdio.h> #include <string.h> #define MAXSIZE 105 int main() { char Berlandish[ ...
- Windows 下运行Makefile文件
下载并安装Microsoft Visual Studio2017 配置环境变量: 计算机右击-属性-高级系统设置-环境变量-选择Path编辑-添加nmake的路径: D:\Microsoft Visu ...
- repo常用命令及常见问题汇总
1.执行repo命令的时候,总是显示“project xx no found” 解决: (1)先执行“repo forall -c pwd” 显示所有project的路径,按照这个来写project参 ...
- pandas处理时间序列(2):DatetimeIndex、索引和选择、含有重复索引的时间序列、日期范围与频率和移位、时间区间和区间算术
一.时间序列基础 1. 时间戳索引DatetimeIndex 生成20个DatetimeIndex from datetime import datetime dates = pd.date_rang ...