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;
}
原文地址:https://www.cnblogs.com/yongren1zu/p/3230135.html