zoukankan      html  css  js  c++  java
  • 「网络流24题」 1. 飞行员配对方案问题

    「网络流24题」 1. 飞行员配对方案问题

    <题目链接>


    比较经典的一道二分图最大匹配。

    匈牙利算法走起啊。

    算出答案后,输出每个外籍飞行员匹配的点(如果有)即可。

    匈牙利算法,简而言之就是,每个x部点u去找自己能匹配上的第一个y部点v,如果v还没有被匹配,或是v已经匹配的x部点w还能匹配其他y部点)就将x与y匹配。

    「如果我除了她(v)还能追到别的妹子,我就把她让给你。」——w对x如是说。

    代码简明易懂。

    #include <cstdio>
    #include <cstring>
    const int MAXN=110;
    bool vis[MAXN],e[MAXN][MAXN];
    int m,n,x,y,ans,cx[MAXN],cy[MAXN];
    bool DFS(int i)
    {
    	for(int j=m+1;j<=n;++j)
    		if(e[i][j] && !vis[j])
    		{
    			vis[j]=1;
    			if(!cy[j] || DFS(cy[j]))
    			{
    				cx[i]=j,cy[j]=i;
    				return 1;
    			}
    		}
    	return 0;
    }
    void Hungary(void)
    {
    	for(int i=1;i<=m;++i)
    		if(!cx[i])
    		{
    			memset(vis,0,sizeof vis);
    			ans+=DFS(i);
    		}
    }
    int main(int argc,char *argv[])
    {
    	scanf("%d %d",&m,&n);
    	while(~scanf("%d %d",&x,&y) && ~x && ~y)
    		e[x][y]=1;
    	Hungary();
    	if(!ans)
    	{
    		printf("No Solution!
    ");
    		return 0;
    	}
    	printf("%d
    ",ans);
    	for(int i=1;i<=m;++i)
    		if(cx[i])
    			printf("%d %d
    ",i,cx[i]);
    	return 0;
    }
    

    谢谢阅读。

  • 相关阅读:
    USACO Name That Number
    USACO Milking Cows
    hdu 1540 Tunnel Warfare (线段树维护左右最长连续区间)
    Contest 1
    JNU周练1026
    树形DP
    Python和C扩展实现方法
    Python模拟C++输出流
    SkipList算法实现
    Python 迭代dict 效率
  • 原文地址:https://www.cnblogs.com/Capella/p/8082651.html
Copyright © 2011-2022 走看看