码迷,mamicode.com
首页 > 其他好文 > 详细

【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题

时间:2014-11-28 19:52:47      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   os   使用   sp   for   strong   on   

学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说


 

把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二分图最大匹配即可。

邻接矩阵,DFS寻找增广路,匈牙利算法

邻接矩阵:复杂度O(n^3)

如果使用邻接表:复杂度O(n*m)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define eps 1e-9
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
typedef long long LL;
int i,j,k,n,m,x,y,T,ans,big,cas,match[505],g[505][505],r,c;
bool flag,vis[505];

bool hungary(int u)//从u开始寻找增广路 
{
    for (int i=1;i<=n;i++)
    {
        if (g[u][i]&&!vis[i])//G数组存储邻接矩阵,match[i]表示当前结点i匹配的结点
        {
            vis[i]=1;
            if (match[i]==0||hungary(match[i]))
                return match[i]=u;
        }
    }
    return 0;
}

int main()
{
    scanf("%d%d",&n,&k);
    for (i=1;i<=k;i++)
    {
        scanf("%d%d",&r,&c);
        g[r][c]=1;
    }
    ans=0;

        /*匈牙利算法过程 - 寻找增广路*/
    for (i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if (hungary(i)) ans++;
    }
    /*寻找结束*/

    printf("%d\n",ans);
    return 0;
}

  

【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题

标签:blog   io   ar   os   使用   sp   for   strong   on   

原文地址:http://www.cnblogs.com/zhyfzy/p/4122157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!