热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【费用流】【CODEVS】1227方格取数2

【算法】最小费用最大流(费用流)【题解】费用流:http:www.cnblogs.comonioncycp6496532.html本题构图:在有限的k次

【算法】最小费用最大流(费用流)

【题解】

费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 

本题构图:

在有限的k次行走中尽可能多的拿到数字,明显的取舍问题,可以用网络流解决。

一共只有k次行走,因此流量至多为k。

而在起点到终点的所有最大流应该使价值最大化(取得数字最大),因此就可以构图了。

为每个节点x复制一个分点x’,从x向x'连一条容量1,费用-num[x]的边(限制数字只能取一次,代价变成负数就可以跑最小费用)

注意:因为每个点其实可以重复经过,但数字不能重复取,因此再从x向x'连一条容量k(相当于inf),费用0的边。

从x’向右和下连容量k,费用0的边。

S向第一格顶连容量k,费用0的边。

最后一格底向T连容量k,费用0的边。

构图完毕。

本题的核心是满足走k次(最大流)的前提下取的数字尽可能大(费用尽可能小),流只是前提,关键在每个节点那条带费用的边。

费用为负数的边越小当然越能吸引水流过去,最后就能跑出最小费用流。

---

注意数组范围!

spfa的vis只决定进不进队列,不妨碍松弛!

#include
#include

#include

using namespace std;
const int inf=0x3f3f3f3f,maxn=60,maxN=5100;
int n,N,k,p[maxn][maxn],first[maxN],tot=1,d[maxN],q[1010],S,T,ans;
bool vis[maxN];
struct edge{int from,v,flow,cost;}e[30000];
void insert(int u,int v,int flow,int cost)
{tot
++;e[tot].v=v;e[tot].flow=flow;e[tot].cost=cost;e[tot].from=first[u];first[u]=tot;tot++;e[tot].v=u;e[tot].flow=0;e[tot].cost=-cost;e[tot].from=first[v];first[v]=tot;
}
bool spfa()
{memset(d,
0x3f,4*(N&#43;N&#43;2));memset(vis,0,N&#43;N&#43;2);int head&#61;0,tail&#61;1;q[0]&#61;T;vis[T]&#61;1;d[T]&#61;0;while(head!&#61;tail){int x&#61;q[head&#43;&#43;];if(head>&#61;1001)head&#61;0;for(int i&#61;first[x];i;i&#61;e[i].from)if(e[i^1].flow&&d[x]&#43;e[i^1].cost<d[e[i].v]){d[e[i].v]&#61;d[x]&#43;e[i^1].cost;if(!vis[e[i].v]){q[tail&#43;&#43;]&#61;e[i].v;if(tail>&#61;1001)tail&#61;0;vis[e[i].v]&#61;1;}}vis[x]&#61;0;}return d[S]<inf;
}
int dfs(int x,int a)
{vis[x]
&#61;1;if(x&#61;&#61;T||a&#61;&#61;0)return a;int flow&#61;0,f;for(int i&#61;first[x];i;i&#61;e[i].from)if(!vis[e[i].v]&&d[x]&#61;&#61;e[i].cost&#43;d[e[i].v]&&(f&#61;dfs(e[i].v,min(a,e[i].flow)))>0){e[i].flow-&#61;f;e[i^1].flow&#43;&#61;f;ans&#43;&#61;e[i].cost*f;a-&#61;f;flow&#43;&#61;f;if(a&#61;&#61;0)break;}return flow;
}
int main()
{scanf(
"%d%d",&n,&k);N&#61;n*n;S&#61;0,T&#61;N&#43;N&#43;1;for(int i&#61;1;i<&#61;n;i&#43;&#43;){for(int j&#61;1;j<&#61;n;j&#43;&#43;){int x;p[i][j]&#61;(i-1)*n&#43;j;scanf("%d",&x);insert(p[i][j],p[i][j]&#43;N,1,-x);insert(p[i][j],p[i][j]&#43;N,k,0);//建立仅供行走的无价值边
}}for(int i&#61;1;i<&#61;n;i&#43;&#43;){for(int j&#61;1;j<&#61;n;j&#43;&#43;){if(j1],k,0);if(i1][j],k,0);}}insert(S,1,k,0);insert(N&#43;N,T,k,0);ans&#61;0;while(spfa()){while(dfs(S,inf))memset(vis,0,N&#43;N&#43;2);}printf("%d",-ans);return 0;
}

View Code

 

 

#include
#include

#include

using namespace std;
int n,k,S,T;namespace nwf2{const int maxn&#61;5010,maxm&#61;10010,inf&#61;0x3f3f3f3f,N&#61;5005;int first[maxn],cur[maxn],tot&#61;1,q[maxn],d[maxn],ans&#61;0;//
bool vis[maxn];struct edge{int v,f,c,from;}e[maxm*2];void insert(int u,int v,int f,int c){tot&#43;&#43;;e[tot].v&#61;v;e[tot].f&#61;f;e[tot].c&#61;c;e[tot].from&#61;first[u];first[u]&#61;tot;tot&#43;&#43;;e[tot].v&#61;u;e[tot].f&#61;0;e[tot].c&#61;-c;e[tot].from&#61;first[v];first[v]&#61;tot;}bool spfa(){memset(d,0x3f,sizeof(d));d[T]&#61;0;vis[T]&#61;1;int head&#61;0,tail&#61;1;q[head]&#61;T;while(head!&#61;tail){//
int x&#61;q[head&#43;&#43;];if(head>N)head&#61;0;for(int i&#61;first[x];i;i&#61;e[i].from)if(e[i^1].f&&d[x]&#43;e[i^1].c//
d[e[i].v]&#61;d[x]&#43;e[i^1].c;if(!vis[e[i].v]){if(d[e[i].v]if(head<0)head&#61;N;q[head]&#61;e[i].v;}else{q[tail&#43;&#43;]&#61;e[i].v;if(tail>N)tail&#61;0;}vis[e[i].v]&#61;1;}}vis[x]&#61;0;}return d[S]<inf;}int dfs(int x,int a){if(x&#61;&#61;T||a&#61;&#61;0)return a;vis[x]&#61;1;int flow&#61;0,f;for(int& i&#61;cur[x];i;i&#61;e[i].from)if(!vis[e[i].v]&&d[e[i].v]&#43;e[i].c&#61;&#61;d[x]&&(f&#61;dfs(e[i].v,min(e[i].f,a)))){//
e[i].f-&#61;f;e[i^1].f&#43;&#61;f;ans&#43;&#61;e[i].c*f;flow&#43;&#61;f;a-&#61;f;if(a&#61;&#61;0)break;}vis[x]&#61;0;return flow;}int dinic(){ans&#61;0;while(spfa()){for(int i&#61;S;i<&#61;T;i&#43;&#43;)cur[i]&#61;first[i];dfs(S,inf);}return ans;}
}
int main(){scanf("%d%d",&n,&k);S&#61;0;T&#61;5001;for(int i&#61;1;i<&#61;n;i&#43;&#43;){for(int j&#61;1;j<&#61;n;j&#43;&#43;){int u;scanf("%d",&u);nwf2::insert((i-1)*n&#43;j,(i-1)*n&#43;j&#43;2500,1,-u);nwf2::insert((i-1)*n&#43;j,(i-1)*n&#43;j&#43;2500,k-1,0);if(i!&#61;n)nwf2::insert((i-1)*n&#43;j&#43;2500,i*n&#43;j,k,0);if(j!&#61;n)nwf2::insert((i-1)*n&#43;j&#43;2500,(i-1)*n&#43;j&#43;1,k,0);}}nwf2::insert(S,1,k,0);nwf2::insert(n*n&#43;2500,T,k,0);printf("%d",-nwf2::dinic());return 0;
}

View Code

 

转:https://www.cnblogs.com/onioncyc/p/6445896.html



推荐阅读
  • Android数组截取技巧及JNI数组交互在仓库构建中的应用分析
    在Android开发中,数组截取技巧和JNI数组交互在仓库构建中的应用具有重要意义。JNI提供了两种主要的数组处理方法:一是生成原生层数组的副本,二是直接通过数组指针进行操作。在进行字符串处理时,如果需要执行其他复杂操作,可以结合这两种方法以提高效率和灵活性。此外,合理利用这些技术可以显著提升应用程序的性能和稳定性。 ... [详细]
  • 【高效构建全面的iOS直播应用】(美颜功能深度解析)
    本文深入探讨了如何高效构建全面的iOS直播应用,特别聚焦于美颜功能的技术实现。通过详细解析美颜算法和优化策略,帮助开发者快速掌握关键技术和实现方法,提升用户体验。适合对直播应用开发感兴趣的开发者阅读。 ... [详细]
  • Dapper:一款高效轻量的ORM框架
    Dapper 是一个高效且轻量级的 ORM(对象关系映射)框架,由 StackExchange 开发并维护。它旨在提供快速的数据访问性能,同时保持代码的简洁性和易用性。Dapper 可以显著提高开发效率,特别适用于需要高性能数据操作的应用场景。更多详细信息可参考其官方文档和 GitHub 仓库。 ... [详细]
  • 深入解析MySQL Replication中的并行复制机制与实例应用【MySQL进阶教程】
    本文深入探讨了MySQL 5.6版本后引入的并行复制机制,详细解析了其工作原理及优化效果。通过具体实例,展示了如何在实际环境中配置和使用并行复制,以提高数据同步效率和系统性能。 ... [详细]
  • 在解决Android应用程序中的ANR问题时,我引入了StrictMode机制。尽管之前未曾使用过这一工具,但通过实践发现它能有效检测并定位性能瓶颈。日志中出现的两个违规记录,除了前四行信息和持续时间存在差异外,还可能涉及不同的线程或操作类型。深入理解这些差异有助于更好地优化应用性能。 ... [详细]
  • 本文详细探讨了Struts框架中几种常用的数据标签,包括`s:property`、`s:a`、`s:debug`、`s:include`和`s:param`。这些标签在实际开发中的应用广泛,不仅用于数据展示和链接生成,还提供了调试和模块化功能。文章分析了每个标签的基本用法及其属性配置,并结合具体示例介绍了如何进行性能优化和最佳实践。通过这些内容,开发者可以更好地理解和利用这些标签,提高开发效率和代码质量。 ... [详细]
  • 在PHP编程中,合理配置会话(SESSION)的生命周期是确保应用性能和安全性的关键。本文将探讨如何通过 `session.gc_maxlifetime` 参数来有效管理会话的有效期,并介绍一些最佳实践,以帮助开发者避免常见问题并提升应用的整体性能。此外,还将讨论如何结合使用 `session.cookie_lifetime` 和 `session.cache_expire` 参数,以实现更精细的会话控制。 ... [详细]
  • 在探讨Java动态代理机制时,本文深入分析了其核心原理与实现方式,并详细讨论了该机制在Spring框架中的应用,特别是在AOP(面向切面编程)中的作用。通过实例解析,读者可以更好地理解如何利用动态代理增强代码的灵活性和可维护性。 ... [详细]
  • 本文详细分析了 LeetCode 1019 题目“链表中每个节点的下一个更大值”,探讨了如何在链表中找到每个节点右侧第一个比其值更大的节点。通过使用栈的数据结构,我们可以高效地解决这一问题,并提供了详细的代码实现和复杂度分析。 ... [详细]
  • 题目链接:http:judge.u-aizu.ac.jponlinejudgedescription.jsp?idALDS1_6_A 输入:一个数组 输 ... [详细]
  • 触发器是数据库中一种特殊类型的存储过程,其执行依赖于预定义的事件,而非直接调用。在数据库管理中,触发器主要用于实现数据完整性、自动化日志记录及复杂业务规则的执行。当对数据库中的表、视图等对象进行插入、更新或删除操作时,系统将自动激活相关的触发器,以确保数据的一致性和安全性。此外,通过合理设计和优化触发器,还可以显著提升数据库性能和响应速度。 ... [详细]
  • Python初学者入门指南:从基础到实践的全面学习路径本文为Python初学者提供了一条从基础到实践的全面学习路径。特别介绍了Python字典(Dictionary)中的`items()`方法,该方法用于返回字典中所有键值对的视图对象,便于在循环和其他操作中使用。通过实例讲解,帮助读者更好地理解和应用这一重要功能。 ... [详细]
  • 在 Linux 环境下,深入探讨 GTK+3.0 的高级开发技巧,涵盖组件定制、事件处理及多线程应用等核心内容,帮助开发者提升应用界面的交互性和性能。 ... [详细]
  • 在MySQL权限管理实践中,新安装的MySQL系统可能会遇到连接问题,如root用户无法访问。本文总结了相关解决方案,包括如何创建新账户(例如:用户名为test,密码为12),并详细介绍了权限分配和管理的策略,以确保系统的安全性和稳定性。 ... [详细]
  • 简介springboot开启事务很简单,只需要一个注解Transactional就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了 ... [详细]
author-avatar
经典调剂行570
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有