最小点集覆盖/HDU2119

题目连接

先试一下题/?/
最小点集覆盖=最大匹配

/*根据i、j建图,跑一边最大匹配
*/
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+5;
int maze[maxn][maxn];
int f[maxn];
bool vis[maxn];
int n,m,ans=0;
bool maching(int x)
{
    for(int i=1;i<=m;i++)
    {
        if(!vis[i]&&maze[x][i])
        {
            vis[i]=1;
            if(f[i]==-1||maching(f[i]))
            {
                f[i]=x;
                return true;
            }
        }
    }
    return false;
}
int hungary()
{
    ans=0;
    memset(f,-1,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        memset(vis,false,sizeof(vis));
        if(maching(i))
            ans++;
    }
    return ans;
}
int main()
{
    while(scanf("%d,",&n),n)
    {
        scanf("%d",&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&maze[i][j]);
        printf("%d\n",hungary());
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要找到一个点集的最小圆覆盖,可以使用 Welzl 算法。下面是一个用 Python 实现的示例代码: ```python import random import math # 计算两个点之间的距离 def distance(p1, p2): return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) # 检查点是否在圆内 def in_circle(circle, point): center, radius = circle return distance(center, point) <= radius # Welzl 算法的递归实现 def welzl(points, boundary): if len(points) == 0 or len(boundary) == 3: if len(boundary) == 3: return boundary elif len(boundary) == 2: circle = (tuple([(boundary[0][0] + boundary[1][0]) / 2, (boundary[0][1] + boundary[1][1]) / 2]), distance(boundary[0], boundary[1]) / 2) return circle else: return None random_point = random.choice(points) points.remove(random_point) circle = welzl(points, boundary) if circle is not None and in_circle(circle, random_point): return circle new_boundary = boundary.copy() new_boundary.append(random_point) return welzl(points, new_boundary) # 使用Welzl算法找到最小圆覆盖 def min_circle_cover(points): random.shuffle(points) return welzl(points, []) # 测试代码 points = [(0, 0), (1, 0), (0, 1), (1, 1), (0.5, 0.5)] circle = min_circle_cover(points) print(f"圆心坐标: {circle[0]}") print(f"半径: {circle[1]}") ``` 这段代码使用了 Welzl 算法来计算点集的最小圆覆盖。首先定义了两个辅助函数:`distance`用于计算两个点之间的距离,`in_circle`用于判断一个点是否在圆内。 然后实现了 Welzl 算法的递归函数 `welzl`,该函数根据输入的点集和边界点列表进行递归计算。在每一步递归中,随机选择一个点并将其从点集中移除,然后继续递归计算。递归的结束条件是点集为空或者边界列表长度为3(即三个点可以确定一个圆)。 最后,定义了 `min_circle_cover` 函数,该函数对点集进行随机打乱后调用 `welzl` 函数来找到最小圆覆盖。 在测试代码中,使用了一个简单的点集进行测试,并打印出最小圆覆盖的圆心坐标和半径。你可以根据自己的需要修改测试代码和输入的点集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值