zoukankan      html  css  js  c++  java
  • P2756 飞行员配对方案问题[二分图最大匹配]

    题目描述

    英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

    对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

    解析

    虽说是网络瘤题,但是显然可以用二分图水过去。刚好最近学了二分图,就把这题水了

    显然是个二分图最大匹配的板子,搞一个匈牙利,输出所有匹配就过了。更何况这题还有SPJ,想怎么搞怎么搞。

    参考代码

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<ctime>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<map>
    #include<bitset>
    #define N 210
    using namespace std;
    int f[N],n,m;
    vector<int> g[N];
    bitset<N> v;
    inline bool dfs(int x)
    {
    	for(register int i=0;i<g[x].size();++i){
    		int y=g[x][i];
    		if(v[y]) continue;
    		v[y]=1;
    		if(!f[y]||dfs(f[y])){
    			f[y]=x;
    			return 1;
    		}
    	}
    	return 0;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	int i,j;
    	while(~scanf("%d%d",&i,&j)&&i!=-1&&j!=-1)
    		g[i].push_back(j);
    	int ans=0;
    	for(int i=1;i<=n;++i){
    		v.reset();
    		if(dfs(i)) ans++;
    	}
    	if(ans){
    		printf("%d
    ",ans);
    		for(int i=1;i<=n+m;++i)
    			if(f[i]) printf("%d %d
    ",f[i],i);
    	}
    	else printf("No Solution!
    ");
    	return 0; 
    }
    
  • 相关阅读:
    对于作用域和闭包的理解
    响应式开发学习(3)——图片优化
    响应式开发(2)
    响应式开发(1)
    数据结构
    进阶题目
    集合
    数组
    内存相关
    线程
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11369414.html
Copyright © 2011-2022 走看看