`
暴风雪
  • 浏览: 385163 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[一般图最大匹配]URAL 1099:Work Scheduling

阅读更多

大致题意:
    给出n个士兵,再给出多组士兵之间两两可以匹配的关系。已知某个士兵最多只能与一个士兵匹配。求最多能够有多少对匹配,并输出这些匹配。

 

大致思路:

    最大匹配问题,对于二分图来说用的是匈牙利算法,求一般图最大匹配用的是带花树开花算法。这里面要注意一点,输出匹配时,要把match[i]和match[match[i]]同时设为-1。

 

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXE 250*250*2
#define MAXN 250
#define SET(a,b) memset(a,b,sizeof(a))
deque<int> Q;
//g[i][j]存放关系图:i,j是否有边,match[i]存放i所匹配的点
bool g[MAXN][MAXN],inque[MAXN],inblossom[MAXN];
int match[MAXN],pre[MAXN],base[MAXN];

//找公共祖先
int findancestor(int u,int v){
    bool inpath[MAXN]={false};
    while(1){
        u=base[u];
        inpath[u]=true;
        if(match[u]==-1)break;
        u=pre[match[u]];
    }
    while(1){
        v=base[v];
        if(inpath[v])return v;
        v=pre[match[v]];
    }
}

//压缩花
void reset(int u,int anc){
    while(u!=anc){
        int v=match[u];
        inblossom[base[u]]=1;
        inblossom[base[v]]=1;
        v=pre[v];
        if(base[v]!=anc)pre[v]=match[u];
        u=v;
    }
}

void contract(int u,int v,int n){
    int anc=findancestor(u,v);
    //SET(inblossom,0);
    memset(inblossom,0,sizeof(inblossom));
    reset(u,anc);reset(v,anc);
    if(base[u]!=anc)pre[u]=v;
    if(base[v]!=anc)pre[v]=u;
    for(int i=1;i<=n;i++)
        if(inblossom[base[i]]){
            base[i]=anc;
            if(!inque[i]){
                Q.push_back(i);
                inque[i]=1;
            }
        }
}

bool dfs(int S,int n){
    for(int i=0;i<=n;i++)pre[i]=-1,inque[i]=0,base[i]=i;
    Q.clear();Q.push_back(S);inque[S]=1;
    while(!Q.empty()){
        int u=Q.front();Q.pop_front();
        for(int v=1;v<=n;v++){
            if(g[u][v]&&base[v]!=base[u]&&match[u]!=v){
                if(v==S||(match[v]!=-1&&pre[match[v]]!=-1))contract(u,v,n);
                else if(pre[v]==-1){
                    pre[v]=u;
                    if(match[v]!=-1)Q.push_back(match[v]),inque[match[v]]=1;
                    else{
                        u=v;
                        while(u!=-1){
                            v=pre[u];
                            int w=match[v];
                            match[u]=v;
                            match[v]=u;
                            u=w;
                        }
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

int main(){
    int n,m,a,b,ans,i;
    while(scanf("%d",&n)!=EOF){
        ans=0;          //最多有几对匹配
        memset(match,-1,sizeof(match));
        memset(g,0,sizeof(g));
        while(scanf("%d%d",&a,&b)!=EOF&&a!=0){
            g[a][b]=g[b][a]=1;
        }
        for(i=1;i<=n;i++){
            if(match[i]==-1&&dfs(i,n)){
                ans++;
            }
        }
        cout<<ans*2<<endl;
        for(i=1;i<=n;i++){
            if(match[i]!=-1){
                printf("%d %d\n",i,match[i]);
                match[i]=match[match[i]]=-1;
            }
        }
    }
    return 0;
}
 
0
1
分享到:
评论

相关推荐

    acm_ural_1099

    【标题】"acm_ural_1099" 是一个与编程竞赛相关的主题,通常在ACM(国际大学生程序设计竞赛)或类似的算法比赛中出现。这类问题旨在测试参赛者解决算法问题的能力,通常需要使用一种或多种编程语言来编写解决方案。 ...

    Ural URAL 解题思路

    《Ural URAL 解题思路》 在编程竞赛和算法挑战的世界中,Ural University的在线判题系统,简称Ural或URAL,是许多程序员磨炼技能的重要平台。它提供了丰富的算法题目,涵盖数据结构、图论、动态规划、数学等多个...

    Ural

    "Ural"是一款字体,可能是指一种特定的中文字体或者西文字体设计。在IT领域,字体扮演着至关重要的角色,特别是在图形设计、网页设计、出版印刷以及各种视觉传达中。字体的选择能够极大地影响信息的呈现效果和用户...

    acm_ural_1148

    标题 "acm_ural_1148" 指向的是一个 ACM(国际大学生程序设计竞赛)问题,这个问题在 Ural University Online Judge(乌拉尔大学在线评测系统)上编号为 1148。描述中的 "Pascal acm_timus_ural_1148.pas" 表明提供...

    URAL部分测试数据

    URAL部分测试数据是针对Timus Online Judge平台的一个竞赛或练习问题的数据集。Timus Online Judge是一个流行的在线编程竞赛和练习平台,它为参赛者提供了一系列的编程题目,以提升编程技能和算法理解能力。这个数据...

    URAL3D

    "URAL3D"是一个与字体相关的主题,这通常指的是一个特定的三维字体设计或字体库。在计算机领域,字体是用于显示和打印文本的图形表示。它们由一系列字符形状组成,包括字母、数字和标点符号,每个都有其独特的样式和...

    hdu pku ural 题目分类

    10. **网络流与最大匹配**:最大流、最小割、匈牙利算法等。 通过学习和练习这些平台上的题目,不仅可以提高编程技巧,还能培养良好的算法思维,这对于参加ACM(国际大学生程序设计竞赛)或其他编程竞赛至关重要。...

    ural部分题解

    "ural部分题解"是一个关于编程竞赛平台Ural(也称为URAL Online Judge或University of Maribor Algorithmic contests)的解题集,由大牛出品。这个资源包含Vol1到Vol3的部分题目解答,虽然不完整,但大约涵盖了200道...

    ural vol I 题解 by yuhch123 pdf

    ### Ural Volume I 题解 by yuhch123 #### 关于 yuhch123 yuhch123 是一位在 IT 和编程竞赛领域内有着卓越成就的人物,曾在 IOI 2008 中荣获金牌第一名。这份文档是他针对 Ural 编程题库第一卷的解答,对于学习算法...

    Ural 1238 源代码

    Ural 1238 源代码 涉及算法(动态规划、贪心、DFS)

    ural题解

    《URAL题解》是针对ACM(国际大学生程序设计竞赛)中URAL在线判题系统题库的详尽解析,涵盖了从Vol_I到Vol_III的所有题目。这些文档旨在帮助参赛者理解和解决各种算法问题,提升编程技能,为比赛做好充分准备。 ...

    Ural ACM 1000源代码(c++)

    【Ural ACM 1000源代码(c++)】是一个编程竞赛相关的项目,其中包含了使用C++语言编写的源代码,这些代码是为了解决特定的算法问题而设计的。Ural ACM通常指的是乌拉尔大学(University of Ural)举办的算法竞赛,这...

    Python库 | ural-0.28.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:ural-0.28.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Ural-开源

    **Ural开源库详解** Ural是一个开源的C++库,专为实现高效、灵活的线性代数计算而设计。这个库的核心特性是利用模板类来表示不同等级的张量,包括标量、向量(等级1)、矩阵(等级2)以及更高阶的张量(如等级3)。...

    线段树题目

    这是一个经典的线段树应用问题,通过线段树维护每个区间的最大值。在查询区间最大值时,只需遍历对应的线段树节点即可快速得到结果。 - **HDU 1166**:求区间和。同样也是经典的应用场景,线段树维护每个区间的和。...

    URAL-PHA

    URAL-PHA是一个与字体相关的主题。在这个压缩包中,我们看到只有一个文件名“2238”,这可能是某种特定字体的文件或者一个包含了多个字体文件的集合。在IT行业中,字体设计是用户界面和视觉传达的重要组成部分,尤其...

    ural

    "ural"是一个与SCSS相关的项目,SCSS是Sass(Syntactically Awesome Style Sheets)的缩写,是一种预处理器语言,它扩展了CSS,增加了变量、嵌套规则、混合、函数等特性,使CSS编写更加简洁和可维护。在"ural-master...

    skillactive:UNIT-Ural 2021的项目

    【标题】"skillactive:UNIT-Ural 2021的项目" 提供的是一个名为SkillActive的项目,该项目在2021年的UNIT-Ural活动中进行。这可能是一个编程或技术开发项目,旨在为用户提供高质量的服务,就像父母为子女提供的关怀...

    模式识别课件

    2. 颜色特征:通过颜色直方图或颜色空间变换(如RGB到HSV)来捕捉图像的颜色信息。 3. 文本ural特征:在文本识别中,词频、n-gram、TF-IDF等方法用于提取文本的关键信息。 4. 频域特征:如傅立叶变换、小波分析等,...

    dpe-frontend:Dural Puncture 硬膜外数据管理前端部分。 后端部分

    【标题】"dpe-frontend" 是一个专为硬膜外穿刺(Dural Puncture Epidural)数据管理设计的前端应用。这个项目是整个系统的一部分,主要关注用户交互和界面展示,而其后端部分则负责处理数据存储、计算和逻辑处理。 ...

Global site tag (gtag.js) - Google Analytics