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; 
    }
    
  • 相关阅读:
    js中location.href的用法
    entityframework单例模式泛型用法
    [C#]从URL中获取路径的最简单方法-new Uri(url).AbsolutePath
    等到花儿也谢了的await
    ASP.NET MVC下的异步Action的定义和执行原理
    实际案例:在现有代码中通过async/await实现并行
    ASP.NET MVC Controllers and Actions
    扩展HtmlHelper
    iOS开发网络篇—XML数据的解析
    IOS学习:常用第三方库(GDataXMLNode:xml解析库)
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11369414.html
Copyright © 2011-2022 走看看