ural 1277. Cops and Thieves【最小割】

本文介绍了一种使用最小割算法解决Cops and Thieves问题的方法。通过将每个城市拆分为两个节点,并调整边的容量,实现最大流与已有警察数量的比较,判断小偷能否成功逃脱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ural 1277. Cops and Thieves【最小割】

分类: 【图论专辑】   210人阅读  评论(2)  收藏  举报

              /*   小偷要从S城市到T城市偷东西,每个城市需要不同数量的警察来看守,现在给出警察数量,看能不能成功阻止小偷
               *   题意即是求最小割,但是由于给出的是每个点的容量,所以需要将每个点拆为两个点,之间连边,容量为点的容量,
               *   两个城市如果相连则容量置为无穷大。然后求最大流看是否大于已有警察数。拆点的时候可以将点i拆为2*i-1和2*i
               *   这个题最后一组数据源点和汇点是一个点,很变态,需要特别考虑。。。@@
               */

 

[cpp]  view plain copy
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #define FOR(a,b) for(int i = a; i<= b; ++i)  
  4. #define INF 0x1f1f1f1f  
  5. #define MAXN 250  
  6. using namespace std;  
  7. int n,m,src,sink,num;  
  8. int cap[MAXN][MAXN],f[MAXN][MAXN],level[MAXN],q[MAXN];  
  9. inline bool dinic_bfs(){  
  10.     int queue[MAXN];  
  11.     memset(level,-1,sizeof(level));  
  12.     int head = 0,tail = 0;  
  13.     queue[tail++] = src;  
  14.     level[src] = 0;  
  15.     while(tail > head){  
  16.         int tep = queue[head++];  
  17.         for(int i = 1;i <= n; ++i){  
  18.             if(level[i] == -1 && cap[tep][i] > f[tep][i]){  
  19.                 level[i] = level[tep] + 1;  
  20.                 queue[tail++] = i;  
  21.             }  
  22.         }  
  23.     }  
  24.     return level[sink] != -1;  
  25. }  
  26. inline int dinic(){  
  27.     int cur,k,m,tail,maxflow = 0, *stack = q;  
  28.     while(dinic_bfs()){  
  29.         tail = 0;  
  30.         stack[tail++] = src;  
  31.         while(tail){  
  32.             cur = stack[tail-1];  
  33.             if(cur == sink){  
  34.                 m = INF;  
  35.                 for(int i = 1;i < tail; ++i){  
  36.                     if(m > cap[stack[i-1]][stack[i]]-f[stack[i-1]][stack[i]]){  
  37.                         m = cap[stack[i-1]][stack[i]]-f[stack[i-1]][stack[i]];  
  38.                         k = i;  
  39.                     }  
  40.                 }  
  41.                 maxflow += m;  
  42.                 for(int i = 1;i < tail; ++i){  
  43.                     f[stack[i-1]][stack[i]] += m;  
  44.                     f[stack[i]][stack[i-1]] -= m;  
  45.                 }  
  46.                 tail = k;  
  47.             }  
  48.             else{  
  49.                 int i;  
  50.                 for(i = 1;i <= n; ++i){  
  51.                     if(level[i] == level[cur] + 1 && cap[cur][i] > f[cur][i]){  
  52.                         stack[tail++] = i;  
  53.                         break;  
  54.                     }  
  55.                 }  
  56.                 if(i == n+1){  
  57.                     level[cur] = -1;  
  58.                     --tail;  
  59.                 }  
  60.             }  
  61.         }  
  62.     }  
  63.     return maxflow;  
  64. }  
  65. int main()  
  66. {  
  67.     while(scanf("%d",&num) != EOF){  
  68.         int k;  
  69.         scanf("%d%d%d%d",&n,&m,&src,&sink);  
  70.         memset(cap,0,sizeof(cap));  
  71.         memset(f,0,sizeof(f));  
  72.         for(int i = 1;i <= n; ++i){  
  73.             scanf("%d",&k);  
  74.             cap[2*i-1][2*i] = k;         // 将一个点拆为两个点,容量为点的容量  
  75.             cap[2*i][2*i-1] = k;  
  76.         }  
  77.         while(m--){  
  78.             int u,v;  
  79.             scanf("%d%d",&u,&v);  
  80.             cap[2*u][2*v-1] = INF;  
  81.             cap[2*v][2*u-1] = INF;  
  82.         }  
  83.         n = 2*n; src = 2*src; sink = 2*sink - 1;  
  84.         int ans = dinic();    
  85.         if(ans > num || sink+1 == src)//如果最大流大于警察数或者源点汇点是一个点  
  86.             printf("NO/n");  
  87.         else printf("YES/n");  
  88.     }  
  89. }  

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值