zoukankan      html  css  js  c++  java
  • 洛谷P2071: 座位安排(二分图最大匹配)

    https://www.luogu.org/problemnew/show/P2071

    题目描述

    已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。

    输入输出格式

    输入格式:

    第一行,一个正整数N。

    第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。

    输出格式:

    一个非负整数,为最多使得多少人满意。

    输入输出样例

    输入样例#1: 复制

    4
    1 2
    1 3
    1 2
    1 3
    1 3
    2 4
    1 3
    2 3
    

    输出样例#1: 复制

    7

    说明

    对于10%的数据 N≤10

    对于30%的数据 N≤50

    对于60%的数据 N≤200

    对于100%的数据 N≤2000

    算法提示:二分图的最大匹配

    解题思路:

    如果理解了匈牙利匹配的话可以发现这是一道二分匹配题,

    因为每排可以坐两个人,所以用l[i][0]代表第一个匹配的人,l[i][1]代表第二个匹配的人,跑一遍匈牙利算法即可。

    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #define N 4020
    using namespace std;
    vector<int>e[N];
    int l[N][2], book[N];
    int dfs(int u)
    {
    	int v, i, len;
    	len=e[u].size();
    	for(i=0; i<len; i++)
    	{
    		v=e[u][i];
    		if(book[v]==0)
    		{
    			book[v]=1;
    			if(l[v][0]==0 || dfs(l[v][0]))
    			{
    				l[v][0]=u;
    				return 1;
    			}
    			if(l[v][1]==0 || dfs(l[v][1]))
    			{
    				l[v][1]=u;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int main()
    {
    	int n, u, i, ans;
    	scanf("%d", &n);
    	for(i=1; i<=n*2; i++)
    	{
    		scanf("%d", &u);
    		e[i].push_back(u);
    		scanf("%d", &u);
    		e[i].push_back(u);
    	}
    	ans=0;
    	for(i=1; i<=n*2; i++)
    	{
    		memset(book, 0, sizeof(book));
    		if(dfs(i))
    			ans++;
    	}
    	printf("%d
    ", ans);
    	return 0;
    }
  • 相关阅读:
    Convolution_model_Application_v1a
    MBSE基于模型的系统工程
    Convolution_model_Step_by_Step_v2a
    深度学习精炼图笔记总结
    TensorFlow_Tutorial_v3b——improving NN performance测验
    maven之安装jar包之本地仓库
    linux之rpm管理
    linux之防火墙
    linux之ntp服务
    linux之chkconfig
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852634.html
Copyright © 2011-2022 走看看