• poj2459 Treasure Exploration (闭包+二分)


    这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分

    #include<stdio.h>
    #include<string.h>
    #define N 505
    
    int match[N],visit[N];
    int n,m;
    int g[N][N];
    int DFS(int u)
    {
        int i;
        for(i=1;i<=n;i++) if(!visit[i]&&g[u][i])
        {
            visit[i]=1;
            if(match[i]==-1||DFS(match[i]))
            {
                match[i]=u;
                return 1;
            }
        }
        return 0;
    }
    int maxMatch()
    {
        memset(match,-1,sizeof(match));
        int ans=0,i;
        for(i=1;i<=n;i++)
        {
            memset(visit,0,sizeof(visit));
            if(DFS(i)) ans++;
        }
        return ans;
    }
    void Floyd()
    {
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if(g[i][k] && g[k][j])
                        g[i][j]=1;
    }
    int main()
    {
        int a,b;
        while(scanf("%d%d",&n,&m))
        {
            memset(g,0,sizeof(g));
            if((n+m)==0)
                break;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                g[a][b]=1;
            }
            Floyd();
            printf("%d
    ",n-maxMatch());
        }
        return 0;
    }
  • 相关阅读:
    数据结构中的知识
    Java中的小知识
    安装Linux虚拟机
    2.Two Sum
    1005. Maximize Sum Of Array After K Negations
    Leetcode刷题记录
    Markdown的使用笔记
    CCF历年试题总结
    在Linux上搭建Hadoop
    配置和使用连接池
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3230135.html
Copyright © 2020-2023  润新知