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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章