zoukankan      html  css  js  c++  java
  • 【网络流#6】POJ 3041 Asteroids 二分图最大匹配

    学习网络流中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
    ",ans);
        return 0;
    }
    

      

  • 相关阅读:
    rtmp推流
    git 分支操作
    git 当前分支推送的新的仓库地址
    git 修改当前项目的仓库地址,项目迁移,仓库修改
    linux 服务器测试端口连通性
    ffmpeg linux 安装
    rtmp 命令详解
    slf4j和log4j源代码解析以及详解
    聊聊java基础,int值强制类型转换成byte
    应用中并发控制技巧
  • 原文地址:https://www.cnblogs.com/zhyfzy/p/4122157.html
Copyright © 2011-2022 走看看