P2763 试题库问题

【题意】

 

 【分析】

 

这样去跑最大流即可,这道题目同时还考察了输出方案的问题,理解每条边的意义即可

【代码】

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define fi first
#define se second
#define lson now<<1
#define rson now<<1|1
typedef long long ll;
int S,T,n,k,m;
const int maxn=1505;
const int maxm=4e4+5;
const int inf=0x3f3f3f3f;
int head[maxn],tot=1;
struct edge
{
    int to,nxt,v;
}e[maxm<<1];
void add(int x,int y,int z)
{
    e[++tot].to=y; e[tot].nxt=head[x]; e[tot].v=z; head[x]=tot;
    e[++tot].to=x; e[tot].nxt=head[y]; e[tot].v=0; head[y]=tot;
}
int dep[maxn];
bool bfs()
{
    memset(dep,-1,sizeof(dep));
    queue <int> q;
    dep[S]=0;
    q.push(S);
    while(!q.empty())
    {
        int u=q.front(); q.pop();
        for(int i=head[u];i;i=e[i].nxt)
        {
            int to=e[i].to;
            if(dep[to]!=-1 || !e[i].v) continue;
            q.push(to);
            dep[to]=dep[u]+1;
        }
    }
    return (dep[T]!=-1);
}
int dfs(int u,int flow)
{
    if(u==T) return flow;
    int res=0;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int to=e[i].to;
        if(dep[to]!=dep[u]+1 || e[i].v<=0) continue;
        int tmp=dfs(to,min(e[i].v,flow));
        flow-=tmp; res+=tmp;
        e[i].v-=tmp; e[i^1].v+=tmp;
    }
    if(!res) dep[u]=-1;
    return res;
}
int dinic()
{
    int ans=0;
    while(bfs())
    {
        ans+=dfs(S,inf);
    }
    return ans;
}
void print(int x)
{
    for(int i=head[x];i;i=e[i].nxt)
    {
        int to=e[i].to;
        if(!e[i].v && to>k)
            printf(" %d",to-k);
    }
}
int main()
{
    
    scanf("%d%d",&k,&n);
    S=0; T=n+k+1;
    int x,y;
    for(int i=1;i<=k;i++)
    {
        scanf("%d",&x);
        m+=x;
        add(S,i,x);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        for(int j=1;j<=x;j++)
        {
            scanf("%d",&y);
            add(y,k+i,1);
        }
    }
    for(int i=1;i<=n;i++) add(i+k,T,1);
    int res=dinic();
    if(res==m)
    {
        for(int i=1;i<=k;i++)
        {
            printf("%d:",i);
            print(i);
            printf("\n");
        }
    }
    else
        printf("No Solution!");
    return 0;
}

 

posted @ 2021-06-03 15:26  andyc_03  阅读(49)  评论(0)    收藏  举报