zoukankan      html  css  js  c++  java
  • 独立最小【网络流第五弹】最大点权独立集 ——HDU 1569 方格取数(2)

    近期朋友几篇文章介绍了改独立最小的文章. 关联文章的地址

        标题:点击开打链接

        和上一道基本一样,依然是最大点权独立集的问题,毫无化变。注意一下数据变大了,所以EK就不行了,SAP或者DINIC。

        每日一道理
    流逝的日子像一片片凋零的枯叶与花瓣,渐去渐远的是青春的纯情与浪漫。不记得曾有多少雨飘在胸前风响在耳畔,只知道沧桑早已漫进了我的心爬上了我的脸。当一个人与追求同行,便坎坷是伴,磨难也是伴。
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <iomanip>
    using namespace std;
    
    typedef  struct {int v,next,val;} edge;
    const int INF=0x3F3F3F3F;
     const int MAXN=4000;
     const int MAXM=50000;
     edge e[MAXM];
     int p[MAXN],eid;
     inline void init(){memset(p,-1,sizeof(p));eid=0;}
     
     //有向
     inline void insert1(int from,int to,int val)
     {
         e[eid].v=to;
         e[eid].val=val;
         e[eid].next=p[from];
         p[from]=eid++;
         swap(from,to);
         e[eid].v=to;
         e[eid].val=0;
         e[eid].next=p[from];
         p[from]=eid++;
     }
     
     //无向
     inline void insert2(int from,int to,int val)
     {
         e[eid].v=to;
         e[eid].val=val;
         e[eid].next=p[from];
         p[from]=eid++;
         swap(from,to);
         e[eid].v=to;
         e[eid].val=val;
         e[eid].next=p[from];
         p[from]=eid++;
     }
     int n,m;//n为点数 m为边数
     int h[MAXN];
     int gap[MAXN];
     int source,sink;
     inline int dfs(int pos,int cost)
     {
         if (pos==sink)
         {
             return cost;
         }
         int j,minh=n-1,lv=cost,d;
         for (j=p[pos];j!=-1;j=e[j].next)
         {
             int v=e[j].v,val=e[j].val;
             if(val>0)
             {
                 if (h[v]+1==h[pos])
                 {
                     if (lv<e[j].val) d=lv;
                     else d=e[j].val;
                     
                     d=dfs(v,d);
                     e[j].val-=d;
                     e[j^1].val+=d;
                     lv-=d;
                     if (h[source]>=n) return cost-lv;
                     if (lv==0) break;
                 }
                 if (h[v]<minh)    minh=h[v];
             }
         }
         if (lv==cost)
         {
             --gap[h[pos]];
             if (gap[h[pos]]==0) h[source]=n;
             h[pos]=minh+1;
             ++gap[h[pos]];
         }
         return cost-lv;
     }
     int sap(int st,int ed)
     {
         source=st;
         sink=ed;
         int ret=0;
         memset(gap,0,sizeof(gap));
         memset(h,0,sizeof(h));
         gap[st]=n;
         while (h[st]<n)
         {
             ret+=dfs(st,INF);
         }
         return ret;
     }
     int main()
     {
     	 int pt,ma;
         while(scanf("%d%d",&pt,&ma)!=EOF)
    	 {
    	 	int tmp;
    		  init();
    		  n=3000;
     		  m=20000;
     		  int sum=0; //最大点权独立集=总权值-最小点权盖覆集=总权值-最小割
    	      int st=0;  //start point
    	      int ed=(pt*ma)+1;
    	      for(int i=1;i<=pt;i++)
    	      {
          		for(int j=1;j<=ma;j++)
          		{
    		      	scanf("%d",&tmp);
    		      	sum+=tmp;
    		      	if((i+j)%2==0)  //偶数序号点
    				{
    					insert1(st,(i-1)*ma+j,tmp);
    					if(i>1)
    					insert1((i-1)*ma+j,(i-2)*ma+j,INF);
    					if(j>1)
    					insert1((i-1)*ma+j,(i-1)*ma+j-1,INF);  //序顺必定不能错 
    					if(i<pt)
    					insert1((i-1)*ma+j,(i)*ma+j,INF);
    					if(j<ma)
    					insert1((i-1)*ma+j,(i-1)*ma+j+1,INF);
    				}
    				else
    					insert1((i-1)*ma+j,ed,tmp);
    		      	
    	        }
    	        
          	}
          	int res=sap(st,ed);
          	printf("%d\n",sum-res);
     	 } 
         return 0;
     }

    文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
      答:因为李艳红这种败类,所以我没女友!

  • 相关阅读:
    Python-05知识-01Python优缺点
    Python-02进阶-06代码优化工具
    Python-02进阶-04多进程多线程
    Python-02进阶-03生成器
    Python-02进阶-02装饰器
    Python-01基础-13功能模块
    Python-01基础-12常用命令
    Python-01基础-11基础知识
    console.dir有很多浏览器,系统的兼容性问题,不要随便用!
    微信支付-签名错误
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3053017.html
Copyright © 2011-2022 走看看