poj 169 分类: poj 2015-04...

本文深入探讨Dinic网络流算法的实现细节,提供了一个基于模板的C++代码示例,详细介绍了如何构建网络流图并使用Dinic算法进行最大流求解。通过一个具体的例子,展示了算法的应用过程。

Dinic网络流,建图很简单,主要是搞个模板。。。


#include<map>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<iostream>
#include<algorithm>

const int EdgeNum = 1e5+5 , NodeNum = 1e3+5 ,INF = 2e8;
const int ni[2] = {-1,1};
const int MAXD = 55, MAXW = 55;

int n , m ,ind = 0 , sum = 0;
int pot[MAXW*7] = {0}, pl;

int head[NodeNum] = {0}, el = 0;

struct FlowEdge{int v,cap,next;}edge[EdgeNum<<1] = {0},emp = {0};

int NewNode(){head[++ind] = 0;return ind;}

void NewEdge(int u,int v,int cap)
{
  ++el, edge[el].v = v;
  edge[el].cap = cap;
  edge[el].next = head[u];
  head[u] = el;
}
void NewFlowEdge(int u,int v,int cap)
{
  NewEdge(u,v,cap);  NewEdge(v,u,0);
}

struct TwoNode{int in,out;};

struct DinicNetWork
{   
    int start , end;
    int dep[NodeNum];
    int line[NodeNum], f, r;

    bool BFS()
    {
      f = r = 0;
      for(int i = 0; i <= ind; i++) dep[i] = 0;

      line[r++] = start;
      dep[start] = 1;

      while(f!=r)
      {
        int now = line[f++];
        for(int i = head[now]; i ; i = edge[i].next)
          if(edge[i].cap)
         {
            int p = edge[i].v;
            if(dep[p])continue;
            else
            {
                dep[p] = dep[now]+1;
                line[r++] = p; 
            }
         }
      }
      if(dep[end])return true;
      else   return false;
    }
    int DFS(int a,int flow)
    {
        if(!flow || a == end)return flow;

        int ret = 0;
        for(int i = head[a]; i && flow; i = edge[i].next)
        {
            int p = edge[i].v;

            if(dep[p] != dep[a] + 1 || !edge[i].cap)continue;

            int ff = DFS(p,std::min(flow,edge[i].cap));

            edge[i].cap -= ff ;
            edge[i+ni[i&1]].cap += ff;
            flow -= ff, ret += ff;
        }
      return ret;
    }
    int mainwork()
    {
      int totflow = 0;  
      while(1)//dinic
      {
        if(BFS() == false)break;
//      memset(hash,false,sizeof(hash));
        totflow += DFS(start,INF);
      }
      return totflow;
    }
}Net = {0};

int main()
{
    int T;

#ifndef ONLINE_JUDGE
    freopen("poj1698.in","r",stdin);
    freopen("poj1698.out","w",stdout);
#endif

    scanf("%d",&T); 
    while(T--)
    {
        sum = ind = el = pl = 0;
        memset(pot,0,sizeof(pot));

        scanf("%d",&m);

        Net.start = NewNode();
        Net.end = NewNode();

        for(int i = 1; i <= m; i++)
        {
          int d, w;static int fi[10];   
          for(int j = 1; j <= 7; j++)
             scanf("%d",&fi[j]);

          scanf("%d%d",&d,&w);  sum += d;

          int miv = NewNode();  NewFlowEdge(Net.start,miv,d);

          for(int j = 1; j <= 7; j++)
            { 
             if(fi[j] == 0)continue;
             for(int k = 0; k < w; k++)
             {
                int si = k*7+j;
                if(!pot[si]){pot[si] = NewNode();}

                pl = std::max(pl,si);
                NewFlowEdge(miv,pot[si],1);
             }
            }
        }
        for(int i = 1; i <= pl; i++)
           if(pot[i])NewFlowEdge(pot[i],Net.end,1);

        if(Net.mainwork() == sum)puts("Yes");
        else puts("No");
    }

#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dashgua/p/4723053.html

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值