H - Prince and Princess - HDU 4685(二分匹配+强连通分量)

题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚。
分析:先求出来他们的最大匹配,因为给的数据未必是完备匹配,所以需要添加一些点使他们成为完备匹配才能求出来的环是完整的,比如第二组数据:
1 2  
2 1 2
如果不添加虚拟点做成匹配,只会匹配成功一个,这样就找不出来环了,所以需要添加虚拟的王子和公主,虚拟的王子喜欢所有的公主,虚拟的公主被所有的王子喜欢,注意都是王子喜欢公主的,公主没有选择喜欢的权利(确实有点悲哀- -)
*************************************************************************
#include<stdio.h>
#include< string.h>
#include<vector>
#include<algorithm>
using  namespace std;

const  int MAXN =  2005;
const  int Base =  500;
/// base 王子的编号从1开始 公主的编号从base+1开始, 虚拟点的编号从base*2+1开始
int N, M;
bool love[ 1005][ 1005];
vector< vector < int> >ans;
/* **************邻接表******************** */
struct Edge{ int v, next;}e[MAXN*MAXN];
int Head[MAXN], cnt;

void AddEdge( int u,  int v)
{
    e[cnt].v = v;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
}
/* *************Tarjan********************* */
int dfn[MAXN], low[MAXN], Index;
int Stack[MAXN], instack[MAXN], top;
int belong[MAXN], bnt;

void Tarjan( int i)
{
     int v;

    dfn[i] = low[i] = ++Index;
    Stack[++top] = i, instack[i] =  true;

     for( int j=Head[i]; j!=- 1; j=e[j].next)
    {
        v = e[j].v;

         if( !dfn[v] )
        {
            Tarjan(v);
            low[i] = min(low[i], low[v]);
        }
         else  if( instack[v] )
            low[i] = min(low[i], dfn[v]);
    }

     if(low[i] == dfn[i])
    {
        ++bnt;
         do
        {
            v = Stack[top--];
            instack[v] =  false;
            belong[v] = bnt;
             if(v > Base)
                ans[bnt].push_back(v-Base);
        }
         while(i != v);
    }
}
/* **************匈牙利******************* */
int Lx[MAXN], Ly[MAXN];
bool used[MAXN];

bool Find( int i)
{
     for( int j=Head[i]; j!=- 1; j=e[j].next)
    {
         int v = e[j].v;

         if( !used[v] )
        {
            used[v] =  true;
             if( !Ly[v] || Find(Ly[v]) )
            {
                Ly[v] = i;
                Lx[i] = v;

                 return  true;
            }
        }
    }

     return  false;
}
void XYL() /// 顺便添加虚拟点
{
     int i, j, k, sum= 0;

     for(i= 1; i<=N; i++)
    {
        memset(used,  falsesizeof(used));
        sum += Find(i);
    }

    k = Base *  2 +  1; /// 虚拟点开开始处

     for(i= 1; i<=N; i++)
    { /// 遍历王子部分,看那个王子没有匹配,为他虚拟一个公主,这个公主所有的王子都喜欢
         if(Lx[i] ==  false)
        {
            Lx[i] = k;
            Ly[k] = i;

             for(j= 1; j<=N; j++)
                AddEdge(j, k);
            k++;
        }
    }



     for(i=Base+ 1; i<=Base+M; i++)
    { /// 遍历公主部分,看哪个公主没有匹配,为她虚拟一个王子,这个王子喜欢所有的公主
         if(Ly[i] ==  false)
        {
            Lx[k] = i;
            Ly[i] = k;

             for(j=Base+ 1; j<=Base+M; j++)
                AddEdge(k, j);
            k++;
        }
    }


     for(i=Base+ 1; i<k; i++)
    { /// 匹配的点添加反边
        AddEdge( i, Ly[i] );
    }
}

/* **************初始化******************* */
void InIt()
{
    ans.clear();
    ans.resize(MAXN);

    memset(love,  falsesizeof(love));
    memset(dfn,  falsesizeof(dfn));
    memset(Head, - 1sizeof(Head));
    memset(Lx,  falsesizeof(Lx));
    memset(Ly,  falsesizeof(Ly));

    cnt = Index = bnt =  0;
}
/* **************************************** */
int main()
{
     int T, t= 1;

    scanf( " %d ", &T);

     while(T--)
    {
         int i, j, v, Len;

        scanf( " %d%d ", &N, &M);
        InIt();

         for(i= 1; i<=N; i++)
        {
            scanf( " %d ", &Len);

             while(Len--)
            {
                scanf( " %d ", &v);
                AddEdge(i, v+Base);
                love[i][v] =  true;
            }
        }

        XYL();

         for(i= 1; i<=N; i++)
        {
             if( !dfn[i] )
                Tarjan(i);
        }

        printf( " Case #%d:\n ", t++);
         for(i= 1; i<=N; i++)
        {
            v = belong[i];
            Len = ans[v].size();

             int a[MAXN], k= 0;

             for(j= 0; j<Len; j++)
            { /// 王子必须喜欢这个公主才行
                 if(love[i][ ans[v][j] ] ==  true)
                    a[k++] = ans[v][j];
            }

            sort(a, a+k);

            printf( " %d ", k);
             for(j= 0; j<k; j++)
                printf( "  %d ", a[j]);
            printf( " \n ");
        }
    }

     return  0;  

}

 

转载于:https://www.cnblogs.com/liuxin13/p/4709705.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
基于GPT-SoVITS的视频剪辑快捷配音工具 GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值