jzoj3782 组队

Description

你的任务是将一群人分到两个队伍中,使得:
1、每个人都属于一个队伍。
2、每个队伍至少有一个人。
3、每个队伍的任意一个人都认识其他人。
4、两支队伍的人数尽可能接近。
这个任务可能有多组解,你可以输出任意一种。
注意:认识是单向的且没有传递性。

Input

第一行为一个整数N,表示总人数。
接下来为N行,每行多个整数x,第i + 1行描述编号为i的人认识x。每行以 0 结尾。

Output

如果无解输出−1;否则输出包含两行, 每行的第一个数字表示该队伍的总人数k,后面接着k个数字,表示被分到该队伍的人。

Sample Input

5
2 3 5 0
1 4 5 3 0
1 2 5 0
1 2 3 0
4 3 2 1 0

Sample Output

3 1 3 5
2 2 4

Data Constraint

对于分值为 30%的数据,N <= 15
对于剩余分值为 70%的数据,N <= 100

Solution

我们先把不能相连的弄出来
那显然他们要放在不同的集合
这样子搞一搞之后
我们就可以dp了
设一个0/1状态f[h][i][j]表示做完前h个小团块 第一个集合放i个 第二个集合放j个是否可行
dp的时候保留一下方案即可

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
int n,i,j,stm,h,k,cnt1,cnt2,a,b,f[105][105][105],x,y,xx,yy,k1,k2,z;
int aa[105][105],bz[105],g[105][2],un[105][105],pr[105],w[105],w1[105];
struct edge{
  int x,y;  
} bf[105][105][105];
int read(){
    int sum=0;
    char c=getchar();
    while (c<'0'||c>'9') c=getchar();
    while (c>='0'&&c<='9'){
        sum=sum*10+c-'0';
        c=getchar();} 
    return sum;
}
void dfs(int x){
    int i,y;
    fo(i,1,un[x][0]){
        y=un[x][i];
        if (bz[y]){
            if (bz[y]==bz[x]) { printf("-1\n"); exit(0);}
        } else {
            bz[y]=(bz[x]==stm)?stm+1:stm;
            if (bz[y]==stm) cnt1++; else cnt2++;
            dfs(y);}
    }
}
int main(){
    //freopen("1.in","r",stdin);
    //freopen("1.out","w",stdout);
    n=read();
    fo(i,1,n){
        k=read();
        while (k) aa[i][k]=1,k=read();}
    fo(i,1,n)
      fo(j,1,n)
        if (i!=j&&(!aa[i][j]||!aa[j][i])) un[i][++un[i][0]]=j;
    fo(i,1,n){
        if (bz[i]) continue;
        stm+=2,cnt2=0,cnt1=1,bz[i]=stm,dfs(i);
        g[++h][0]=cnt1,g[h][1]=cnt2;
        pr[h]=stm;}
    f[0][0][0]=1;
    fo(i,1,h)
      fo(a,0,n)
        fo(b,0,n) {
          if (a+g[i][0]<=n&&b+g[i][1]<=n){
            f[i][a+g[i][0]][b+g[i][1]]|=f[i-1][a][b];
            if (f[i-1][a][b]) {
                bf[i][a+g[i][0]][b+g[i][1]].x=a;
                bf[i][a+g[i][0]][b+g[i][1]].y=b;}
          }
          if (a+g[i][1]<=n&&b+g[i][0]<=n){
            f[i][a+g[i][1]][b+g[i][0]]|=f[i-1][a][b];
            if (f[i-1][a][b]){
                bf[i][a+g[i][1]][b+g[i][0]].x=a;
                bf[i][a+g[i][1]][b+g[i][0]].y=b;}
          }
    }
    fd(i,n/2,1)
      if (f[h][i][n-i]){
        x=i,y=n-i;
        fd(j,h,1){
            xx=bf[j][x][y].x,yy=bf[j][x][y].y;
            k1=pr[j],k2=k1+1;
            if (x-xx==g[j][1]) swap(k1,k2);
            fo(z,1,n) if (bz[z]==k1) w[++w[0]]=z;
              else if (bz[z]==k2) w1[++w1[0]]=z;
            x=xx,y=yy;
          }
          fo(j,0,w[0]) printf("%d ",w[j]);
          printf("\n");
          fo(j,0,w1[0]) printf("%d ",w1[j]);
          printf("\n");
          return 0;
      }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值