HDU2063 롤러 코스터 (헝가리 알고리즘, 페어링 문제)

[설명] 문제
RPG 소녀 오늘 우리가 놀이에 놀이터에 갔다는 꿈은 마지막으로 롤러 코스터를 얻을 수 있습니다. 그러나, 2 개의 좌석의 각 행뿐만 아니라 불문율의 롤러 코스터는 모든 여자가 같은 휴식을 할 수있는 파트너와 그녀의 소년을 발견해야한다는 것입니다. 그러나 각 소녀는 자신의 아이디어를 가지고 예를 들어, 수행 또는 수행 또는 탕자 또는 의사 호모 파트너의 물을 할 PrincessSnow 기꺼이 LL 파트너에만 의지 PQK 파트너, 잔디와 linle에 토끼와 XHD에만 의지. 계정에 재무 적 영향을 고려 상사 리우는 사람들이 롤러 코스터, 다른 사람이, 이봐, 내가보고 아래에 서서 앉아있는 파트너를 찾을 수 있습니다 결정했다. 스마트 Acmer, 당신은 당신이 롤러 코스터에 얻을 수있는 조합의 최대 수를 계산 도와 드릴까요?

입력
입력 데이터의 첫 번째 행은 K, M, N은 각각의 조합 가능한 개수의 수 여자의 수가 세 남자 정수이다. 0 <K <= 1000
. 1 <= N 및 M <= 500 K 다음의 행의 각 행은 두 숫자 파트너 할 각각 남녀 아이 비제이 의지를 갖는다. 마지막 입력 단부 0.

출력
각 시험 출력 롤러 코스터 앉을 수있는 조합의 수를 나타내는 정수.

입력 샘플
6 3 3
1 1
1 2
1 3
1 2
2 3
3 1
0

샘플 출력
3

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
//匈牙利算法,用起来吧
int k,m,n;//组合数,女生的人数和男生的人数
bool line[100][100];//判断男生和女生的联系
bool used[100];//男生是否被选中
int boy[100];//女生对应的男生是谁
//这一题是女生找男生
int i,j;
bool find(int x){
    //x就是对应的女生,然后访问全部的男生
    for(i=1;i<=n;i++){
        if(line[x][i]&&!used[i]){
            //如果他们之间有连线,并且男生没有被访问
            used[i]=true;//这个是用来之后递归用的
            //再来一个循环
            if(boy[i]==0||find(boy[i])){
                //如果这个男生还没有选中女生,或者选中的女生可以换到别的男生的话
                boy[i]=x;
                return true;
            }
        }
    }
    return false;
}
int main(){
    //输入对应的组合数和女生,男生的数量
    //忘记初始化了。。
    memset(boy,0,sizeof(boy));
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
        line[i][j]=false;
    int a,b,sum=0;
    scanf("%d%d%d",&k,&m,&n);
    //再输入组合数
    for(i=0;i<k;i++){
        scanf("%d%d",&a,&b);
        line[a][b]=true;//
    }
    //开始循环每一个女生
    for(i=1;i<=m;i++){
        memset(used,false,sizeof(used));//这里需要值得注意的是,每次都需要清空一下,因为每一次都需要从第一个开始访问,不然不清空的话,是接着之后的访问了
        if(find(i))//如果这个女生能找到的话,那就组合加一
            sum++;
    }
    printf("%d",sum);

}

게시 72 개 원래 기사 · 원 찬양 5 · 조회수 2795

추천

출처blog.csdn.net/qq_41115379/article/details/105006044