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-12;
typedef long long lon;
const lon SZ=1010,S=2010,T=2011,SSZ=2*SZ,one=1,INF=0x7FFFFFFF,mod=1000000007;
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,0,sizeof(dep));
    queue<int> q;
    q.push(S);
    dep[S]=1;
    for(;q.size();)
    {
        int fr=q.front();
        q.pop();
        //cout<<fr<<endl;
        for(int i=1;i<=T;++i)
        {
            if(src[fr][i]&&!dep[i])
            {
                dep[i]=dep[fr]+1;
                q.push(i);
                if(i==T)return 1;
            }
        }
    }
    return 0;
}

int dinic(int x,int flow)
{
    if(x==T)return flow;
    else
    {
        int rem=flow;
        for(int i=1;i<=T&&rem;++i)
        {
            if(src[x][i]&&dep[i]==dep[x]+1)
            {
                int tmp=dinic(i,min(rem,src[x][i]));
                if(!tmp)dep[i]=0;
                rem-=tmp;
                src[x][i]-=tmp;
                src[i][x]+=tmp;
            }
        }
        return flow-rem;
    }
}

void init()
{
    cin>>n>>m;
    for(lon i=1;i<=n;++i)
    {
        src[S][i]=1;
        lon knum;
        cin>>knum;
        for(lon j=0;j<knum;++j)
        {
            lon id;
            cin>>id;
            mp[i][id+n]=1;
            src[i][id+n]=1;
        }
    }
    for(int i=1;i<=m;++i)src[i+n][T]=1;
    for(;bfs();)
    {
        dinic(S,INF);
    }
    num=n+m;
    for(lon i=1;i<=n;++i)
    {
        int ok=0;
        for(int j=1;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]=1;
                ok=1;
            }
        }
        if(!ok)
        {
            mk[i]=1;//not used
            ++num;
            for(int j=1;j<=n;++j)
            {
                mp[j][num]=1;
            }
            mp[num][i]=1;
        }
        //cout<<mk[i]<<endl;
    }
    for(int i=1;i<=m;++i)
    {
        //cout<<src[i+n][T]<<endl;
        if(src[i+n][T]==1)
        {
            sz[i]=1;
            ++num;
            for(int j=1;j<=m;++j)
            {
                mp[num][j+n]=1;
            }
            mp[i+n][num]=1;
        }
    }
}

void dfs(lon x)
{
    dfn[x]=low[x]=++cnt;
    stk.push(x);
    ins[x]=1;
    for(lon i=1;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]=0;
            if(top==x)break;
        }
    }
}

void work()
{
    for(lon i=1;i<=n+m;++i)if(!dfn[i])dfs(i);
    for(lon i=1;i<=n;++i)
    {
        vector<lon> ans;
        //cout<<bel[i]<<" "<<bel[i+n]<<endl;
        for(lon j=1;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=0;j<ans.size();++j)
        {
            cout<<" "<<ans[j];
        }
        cout<<endl;
    }
    for(lon i=1;i<=n;++i)
    {
        src[S][i]=0;
        for(lon j=n+1;j<=n+m;++j)mp[i][j]=mp[j][i]=src[i][j]=0;
    }
    for(lon i=1;i<=m;++i)
    {
        src[i+n][T]=0;
    }
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(bel,0,sizeof(bel));
    memset(mk,0,sizeof(mk));
    memset(sz,0,sizeof(sz));
    memset(ins,0,sizeof(ins));
    memset(mp,0,sizeof(mp));
    memset(src,0,sizeof(src));
    for(;stk.size();stk.pop());
    cnt=tot=0;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    cin>>casenum;
    //cout<<casenum<<endl;
    for(int time=1;time<=casenum;++time)
    //for(lon time=1;cin>>n;++time)
    {
        //printf("Case #%d:\n",time);
        cout<<"Case #"<<time<<":"<<endl;
        init();
        work();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/gaudar/p/10721690.html