20180520wl赛T3赛后题解

题目

题目背景

小Z今天和小伙伴们一起去毕业游到游乐场玩,终于可以坐上梦寐以求的海盗船了。

题目描述

海盗船的每一排只有两个座位,为了安全起见,每个女生必须与一个男生坐一排。但是,每个人都希望与自己认识的人坐在一起。请问如何安排座位才能让更多的人满意呢?小Z的小伙伴们实在是太多了。

输入输出格式

输入格式:
第一行:两个数n和m,分别表示n个人和m个关系。

以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Mi和Mj具有关系。

输出格式:
找出全部符合,然后输出符合数最多的。

输入输出样例

输入样例#1: 复制
6 5
1 4
1 5
2 5
2 6
3 4
输出样例#1: 复制
3
说明

1≤n,m≤10000

题解

//U25699 毕业游

//题目提供者 lijiahao2017
//评测方式 云端评测
//标签 洛谷原创 2018 广东
//难度 尚无评定
//时空限制 1000ms / 128MB

//这道题是一道二分图(匈牙利)的模板题
//做一次最大二分图匹配
//累计符合数最多,输出 

#include <cstdio>//头文件 
#define ll long long
ll book[10001];
ll match[10001];
bool e[101][101];
ll ans=0,n=0,m=0;
//定义变量和数组 
bool dfs(ll u)//最大二分图匹配 
{
    for(ll i=1;i<=n;i++)
    {
        if(book[i]==0 && e[u][i]==true)
        {
            book[i]=1;
            if(match[i]==0 || dfs(match[i])==true)
            {
                match[u]=i;
                match[i]=u;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%lld %lld",&n,&m);
    for(ll i=1;i<=m;i++)
    {
        ll x=0,y=0;
        scanf("%lld %lld",&x,&y);
        e[x][y]=true;
        e[y][x]=true;
    }
    //输入 
    for(ll i=1;i<=n;i++)
    {
        for(ll j=1;j<=n;j++)//每次都要清0 
        {
            book[j]=0;
        }
        if(dfs(i)==true)//符合就累计 
        {
            ans++;
        }
    }
    printf("%lld",ans);//输出最多符合数 
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章