【小M的作物】

这是一道我好像没写过的最小割

这道题如果没有那\(m\)条限制,我们完全可以贪心来做

但是硬要用网络流怎么办

可以转化为最小割模型

我们将源点\(S\)表示为耕地\(A\),汇点\(T\)表示为耕地\(B\),对于一个点\(i\),源点向\(i\)连一条容量为\(a_i\)的边,\(i\)向汇点连一条容量为\(b_i\)的边

这样的话为了使得\(S\)\(T\)不连通,所以对于\(i\)来说\(a_i\)\(b_i\)必须割掉一条,于是转化成了一个最小割

还有\(m\)条限制,我们可以把限制视为割掉某些边中的一条边,那么就必须额外割掉一条边

我们对于每一个限制搞一个虚点,先是\(S\)向虚点连一条容量为\(c\)的边,之后这个虚点向限制包含的所有点连为\(INF\)的边

这样话如果这点和\(S\)之间的边被割掉,说明后面那条和\(T\)相连的边没有被割掉,所以就必须割掉那条容量为\(c\)的边

耕地\(B\)同理

之后这道题还需要当前弧优化

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#define re register
#define maxn 10005
#define INF 999999999
struct E
{
    int v,nxt,w,f;
}e[4400000];
int head[maxn],d[maxn],cur[maxn];
int n,num=1,S,T,ans,m,Now;
inline void add_edge(int x,int y,int z)
{
    e[++num].v=y;
    e[num].nxt=head[x];
    e[num].w=z;
    head[x]=num;
}
inline int min(int a,int b){return (a<b)?a:b;}
inline void connect(int x,int y,int z){add_edge(x,y,z),add_edge(y,x,0);}
inline int BFS()
{
    std::queue<int> q;
    for(re int i=0;i<=Now;i++)
        d[i]=0,cur[i]=head[i];
    d[S]=1;
    q.push(S);
    while(!q.empty())
    {
        int k=q.front();
        q.pop();
        for(re int i=head[k];i;i=e[i].nxt)
        if(!d[e[i].v])
        {
            if(e[i].w<=e[i].f) continue;
            d[e[i].v]=d[k]+1;
            q.push(e[i].v);
        }
    }
    return d[T];
}
int dfs(int x,int now)
{
    if(x==T||!now) return now;
    int ff,flow=0;
    for(re int& i=cur[x];i;i=e[i].nxt)
    if(d[e[i].v]==d[x]+1)
    {
        ff=dfs(e[i].v,min(now,e[i].w-e[i].f));
        if(ff<=0) continue;
        flow+=ff,now-=ff;
        e[i].f+=ff,e[i^1].f-=ff;
        if(!now) break;
    }
    return flow;
}
inline int read()
{
    char c=getchar();
    int x=0;
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')
      x=(x<<3)+(x<<1)+c-48,c=getchar();
    return x;
}
int main()
{
    n=read();
    S=0,T=n+1;
    int a,b;
    for(re int i=1;i<=n;i++) a=read(),connect(S,i,a),ans+=a;
    for(re int i=1;i<=n;i++) b=read(),connect(i,T,b),ans+=b;
    m=read();
    Now=n+1;
    int N,c1,c2,t;
    for(re int i=1;i<=m;i++)
    {
        Now++,Now++;
        N=read(),c1=read(),c2=read();
        ans+=c1+c2;
        connect(S,Now-1,c1);
        connect(Now,T,c2);
        for(re int j=1;j<=N;j++)
        {
            t=read();
            connect(Now-1,t,INF);
            connect(t,Now,INF);
        }
    }
    while(BFS()) ans-=dfs(S,INF+1);
    std::cout<<ans;
    return 0;
}
/*
3
4 2 1
2 3 2
1
2 3 2 1 2
*/

转载于:https://www.cnblogs.com/asuldb/p/10205690.html

### 高分辨率遥感影像作物识别中的样本数据集与标注工具 对于高分辨率遥感影像(如2米分辨率)的作物识别任务,构建高质量的数据集并进行有效的标注是非常重要的环节。以下是关于样本数据集的选择以及打点标注的方法和工具。 #### 数据集选择 在农业领域中,常用的公开高分辨率遥感影像数据集包括但不限于以下几种: - **Sentinel-2**:提供多光谱波段的卫星影像,空间分辨率为10至60米不等,适合大范围农田监测[^2]。 - **Landsat 8 OLI/TIRS**:虽然其基础分辨率为30米,但在特定场景下可以通过超分辨率重建技术提升到接近2米的效果[^3]。 - **PlanetScope** 和 **SkySat**:这些商业平台提供了更高分辨率(<3m甚至亚米级),非常适合精细尺度上的作物分类研究[^4]。 如果目标是获取具体针对某种农作物类型的训练样例,则可以考虑一些专门设计用于此类目的数据库比如CropTypeDataset或者Agricultural-Vision Challenge所提供的资源集合[^5]。 #### 标注方式 - 打点法介绍 为了实现精准定位每一块田地中种植的具体种类,在创建监督学习模型所需的标签过程中,“打点”是一种常见而有效的方式之一。“打点”的基本原理是在地图上标记出代表不同类别对象的位置坐标点,并通过插值算法扩展成区域覆盖整个地块边界线形成矢量图层作为最终输出结果给定输入栅格图片对应位置处附加额外属性字段指示所属类别的名称字符串形式表达出来即可完成一次完整的记录操作流程描述如下所示: ```python import geopandas as gpd from shapely.geometry import Point, Polygon def create_point_label(x, y, category): """ 创建单个点特征 """ point = Point(x, y) feature = {'geometry': point, 'properties': {"category": category}} return feature # 假设我们已经知道某几个关键采样地点及其对应的类别名列表 points_data = [(lon1,lat1,'wheat'), (lon2,lat2,'corn')] features_list = [] for p in points_data: features_list.append(create_point_label(*p)) gdf_points = gpd.GeoDataFrame(features_list).set_geometry('geometry') ``` 上述脚本展示了如何利用Python库`geopandas`来生成基于经纬度坐标的几何要素实例并向其中加入自定义元信息以便后续处理阶段能够轻松读取解析所需参数值从而达到预期效果即建立起了原始素材文件夹结构体系供下一步深入挖掘分析所用[^6]. #### 自动化辅助手段探讨 尽管手动执行逐像素级别精确划定轮廓边界的作业模式仍然占据主流地位但由于耗时费力效率低下因此近年来越来越多的研究者尝试引入计算机视觉技术和机器学习框架来自动生成初始猜测版本然后再交由人工校验修正减少重复劳动强度提高整体工作效率例如采用深度神经网络预测分割掩码再结合交互式编辑界面快速调整细节部分直至满意为止这种方法不仅适用于大规模生产环境同时也兼顾到了科研探索需求层面两者相辅相成共同推动行业发展进步趋势明显可见一斑[^7]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值