sgu-242 Student's Morning

题目大意:

有N个人,K个大学,每个人有Gi个心仪的学校,为集合Si,然后然后这N个人可以去任意一个且仅一个他心仪的学校,问是否可以使得K个学校每个学校都有不小于2个人去。如果没有,输出”NO”,否则输出”YES”,然后接下来K行,每行一个数,表示去第i个学校的人有几个,接下来输出那几个人去哪个学校。PS:有的人可以不去学校,只要满足每个学校有2个及以上的人去就行了,不要求N个人每个人都去上学,比如可以在家浪。。。。。。

解题思路:

首先这道题目显然可以用有上下确界的可行流做,但是太麻烦了,直接跑最大流就行了啊。

首先原点St向所有的学生连一条流量为1的边,所有的学生向他心仪的学校连一条流量为1的边,然后每个学校向汇点En连一条流量为2的边,然后跑最大流,如果最后Max?Flow=K?2说明是可行的,否则是不行的。

AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#define Min(a,b) ((a)>(b)?(b):(a))

using namespace std;

int G[510][510]={{0}};
int f[510][510]={{0}};
int N,K;
int st=0,en;
int dist[510]={0};
int dui[510]={0};
int duip=0;

void bfs()
{
    duip=0;
    dui[++duip]=en;
    for(int i=1;i<=duip;i++)
    {
        int u=dui[i];
        for(int v=0;v<=en;v++)
        {
            if(G[v][u]-f[v][u]>0 && dist[v]>dist[u]+1)
            {
                dist[v]=dist[u]+1;
                dui[++duip]=v;
            }
        }
    }
    return;
}

int Max_Flow(int now,int Max)
{
    if(now==en) return Max;
    int sum=0;
    for(int i=0;i<=en;i++)
    {
        if(G[now][i]-f[now][i]>0 && dist[now]==dist[i]+1)
        {
            int tmp=Min(G[now][i]-f[now][i],Max);
            tmp=Max_Flow(i,tmp);
            sum+=tmp;
            Max-=tmp;
            f[now][i]+=tmp;
            f[i][now]-=tmp;
            if(Max==0) return sum;
        }
    }
    return sum;
}

void prt()
{
    for(int i=N+1;i<=en-1;i++)
    {
        printf("2 ");
        for(int j=1;j<=N;j++)
            if(f[j][i]==1)
                printf("%d ",j);
        puts("");
    }
    return;
}

int main()
{
    scanf("%d%d",&N,&K);
    en=N+K+1;
    for(int i=1;i<=N;i++)
    {
        int num=0;
        scanf("%d",&num);
        for(int j=1;j<=num;j++)
        {
            int sb;
            scanf("%d",&sb);
            G[i][sb+N]=1;
        }
        G[st][i]=1;
    }
    for(int i=1;i<=K;i++)
        G[i+N][en]=2;
    int ans=0;
    for(;;)
    {
        memset(dist,0x3f3f3f3f,sizeof(dist));
        dist[en]=0;
        bfs();
        if(dist[st]==0x3f3f3f3f)
            break;
        ans+=Max_Flow(st,2e9);
        if(ans==K*2) break;
    }
    if(ans!=K*2)
        cout<<"NO"<<endl;
    else
    {
        cout<<"YES"<<endl;
        prt();
    }
    return 0;
}

sgu-242 Student's Morning

时间: 2024-10-09 21:34:11

sgu-242 Student's Morning的相关文章

SGU 242. Student&#39;s Morning( 网络流 )

看英文题真是麻烦...理解题意花的时间比想的时间还长...裸的网络流, 我们只要限制每个人出发流量为1, 每个大学进入的流量至多为2即可, 相当于构造可行解. ---------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype&

SGU 242 Student&amp;#39;s Morning 网络流(水

题目链接:contest=0&problem=242">点击打开链接 题意: 给定n个人,m个终点 以下n行表示每一个人能够去m个点. 每一个人仅仅能去一个点. 输出随意一个方案使得每一个点至少有2个人到达. 若存在输出m行,第一个数字表示i这个点来了几个人,后面是人的点标. 思路: 建一个二部图n-m,然后m到汇点限流2.推断是否满流,若不满流就无解. 若满流则其它的人随便走. #include <stdio.h> #include <string.h>

SGU 242 Student&#39;s Morning 网络流(水

题目链接:点击打开链接 题意: 给定n个人,m个终点 下面n行表示每个人可以去m个点. 每个人只能去一个点. 输出任意一个方案使得每个点至少有2个人到达. 若存在输出m行,第一个数字表示i这个点来了几个人,后面是人的点标. 思路: 建一个二部图n-m,然后m到汇点限流2,判断是否满流,若不满流就无解. 若满流则其他的人随便走. #include <stdio.h> #include <string.h> #include <iostream> #include <

网络流专栏

最大流 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance(构图) POJ 1459 Power Network(构图) POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举) POJ 1637 Sightseeing tour (

Soj题目分类

-----------------------------最优化问题------------------------------------- ----------------------常规动态规划  SOJ1162 I-Keyboard  SOJ1685 Chopsticks SOJ1679 Gangsters SOJ2096 Maximum Submatrix  SOJ2111 littleken bg SOJ2142 Cow Exhibition  SOJ2505 The County

网络流柱

最大流量 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance(构图) POJ 1459 Power Network(构图) POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举) POJ 1637 Sightseeing tour

待刷题目分类

各大OJ题目归类 Posted on 2012 年 8 月 8 日 by admin ---------–最优化问题------------- --------动态规划 SOJ1162 I-Keyboard SOJ2096 Maximum Submatrix SOJ2111 littleken bg SOJ2505 The County Fair SOJ2818 QQ音速 SOJ2469 Exploring Pyramids SOJ1833 Base Numbers SOJ2009 Zeros

网络流题集

最大流POJ 1273 Drainage DitchesPOJ 1274 The Perfect Stall (二分图匹配)POJ 1698 Alice's Chance(构图)POJ 1459 Power Network(构图)POJ 2112 Optimal Milking (二分)POJ 2455 Secret Milking Machine (二分)POJ 3189 Steady Cow Assignment (枚举)POJ 1637 Sightseeing tour (混合图欧拉回路)

Hibernate 一对多双向关联Demo

以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { private long cid; private String cname; private String cdesc; private Set<Student> students; //get和set } //Student .java public class Student implements Se

SGU242:最大流

最近总是刷阅读理解还是有点好处的...给出k个学校和n和学生的喜欢名单,每个学校至少有两个学生拜访,每个学生只能去一次,求是否能满足k个学校都能去拜访,能的话给出方案.(然而里面的company那里是说什么...).试着建图,s到每个学生c=1,每个学生到喜欢的学校c=1,每个学校到t c=2,然后就好了,感觉不算难. ------------------------------------------------------------------------------------ #inc