UvaL-7670 上下界可行费用流
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #define P 55
- #define N 2050
- #define INF (1<<30)
- using namespace std;
- int n,m,S,T,ss,tt,cnt=,tot=;
- int head[N],d[N],p[N],qlc[P],qrc[P],qlr[P],qrr[P];
- int map[P][P],sc[P],sr[P],r[P],c[P],dis[N];
- int ans,tl;
- struct Edge{ int a,b,v,cost,next; }e[*N];
- void add(int a,int b,int v,int cost) {
- e[++cnt].a = a;
- e[cnt].b = b;
- e[cnt].v = v;
- e[cnt].cost = cost;
- e[cnt].next = head[a];
- head[a] = cnt;
- }
- inline void add_Node(int a,int b,int vl,int vr,int cost) {
- //printf("Node %d %d %d %d\n",a,b,vl,vr);
- d[a] -= vl; d[b] += vl;
- add(a,b,vr-vl,cost); add(b,a,,-cost);
- }
- void paul() {
- ss = tot+; tt = tot+;
- for (int _=;_<=tot;_++) {
- if (d[_] < ) add(_,tt,-d[_],) , add(tt,_,,);
- if (d[_] > ) add(ss,_, d[_],) , add(_,ss,,);
- }
- }
- #define cp e[i].v
- #define B e[i].b
- bool SPFA() {
- bool flag = false;
- memset(p,,sizeof(p));
- memset(dis,0x3f3f3f3f,sizeof(dis));
- dis[ss] = ;
- queue<int> q; q.push(ss);
- while (!q.empty()) {
- int u = q.front(); q.pop();
- if (u == tt) flag = true;
- for (int i=head[u];i;i=e[i].next)
- if (cp > && dis[u] + e[i].cost < dis[B]) {
- dis[B] = dis[u] + e[i].cost;
- p[B] = i;
- q.push(B);
- }
- }
- return flag;
- }
- void mcf() {
- int g = p[tt] , flow = INF;
- while (g) {
- flow = min(flow , e[g].v);
- g = p[ e[g].a ];
- }
- g = p[tt];
- while (g) {
- e[g ].v -= flow;
- e[g^].v += flow;
- ans += e[g].cost * flow;
- g = p[ e[g].a ];
- }
- tl += flow;
- }
- void init() {
- memset(head,,sizeof(head));
- memset(e,,sizeof(e));
- memset(d,,sizeof(d));
- //memset(qlr,0,sizeof(qlr));
- //memset(qrr,0,sizeof(qrr));
- //memset(qlc,0,sizeof(qlc));
- //memset(qrc,0,sizeof(qrc));
- memset(sc,,sizeof(sc));
- memset(sr,,sizeof(sr));
- memset(c,,sizeof(c));
- memset(r,,sizeof(r));
- memset(map,,sizeof(map));
- cnt = ; tot = ;
- S = ++tot; T = ++tot; add_Node(T,S,,INF,);
- ans = tl = ;
- }
- int main() {
- #ifndef ONLINE_JUDGE
- freopen("5.in","r",stdin);
- #endif
- while (~scanf("%d",&n)) {
- init();
- for (int i=;i<=n;i++) for (int j=;j<=n;j++) {
- scanf("%d",&map[i][j]);
- if (map[i][j]) sr[i]++ ,sc[j]++;
- }
- for (int i=;i<=n;i++) r[i] = ++tot , c[i] = ++tot;
- for (int i=;i<=n;i++) {
- scanf("%d%d",&qlr[i],&qrr[i]);
- add_Node(S,r[i],sr[i],sr[i],); //³¬¼¶Ô´ --> µÚiÐÐ
- add_Node(r[i],T,qlr[i],qrr[i],); //µÚiÐÐ --> ³¬¼¶»ã
- }
- for (int i=;i<=n;i++) {
- scanf("%d%d",&qlc[i],&qrc[i]);
- add_Node(S,c[i],sc[i],sc[i],); //³¬¼¶Ô´ --> µÚiÁÐ
- add_Node(c[i],T,qlc[i],qrc[i],); //µÚiÁÐ --> ³¬¼¶»ã
- }
- for (int i=;i<=n*n/;i++) {
- int x1,y1,x2,y2;
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
- if (map[x1][y1] == map[x2][y2]) continue;
- if (!map[x1][y1]) swap(x1,x2) , swap(y1,y2);
- if (x1 == x2) add_Node(c[y1],c[y2],,,); //Èç¹ûÔÚͬһÐÐ ¾ÍÔÚÁÐÖ®¼äÁ¬±ß
- if (y1 == y2) add_Node(r[x1],r[x2],,,); //Èç¹ûÔÚͬһÁÐ ¾ÍÔÚÐÐÖ®¼äÁ¬±ß
- }
- paul(); //²¹ÉÏËùÓвðµÄ±ß
- //for (int i=2;i<=cnt;i+=2) if (e[i].v) printf("%d %d %d %d\n",e[i].a,e[i].b,e[i].v,e[i].cost);
- while (SPFA())
- mcf();
- //for (int i=3;i<=cnt;i+=2) if (e[i].v) printf("%d %d %d\n",e[i].b,e[i].a,e[i].v);
- for (int i=head[ss];i;i=e[i].next) if (e[i].v) ans = -;//ÅжÏÊÇ·ñÓнâ
- if (ans == -) puts("-1"); else printf("%d\n",ans);
- }
- return ;
- }
UvaL-7670 上下界可行费用流的更多相关文章
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流
https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...
- BZOJ 2055: 80人环游世界(有上下界的费用流)
题面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Descript ...
- 【上下界网络流 费用流】bzoj2055: 80人环游世界
EK费用流居然写错了…… Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团 ...
- Codeforces Gym 101190 NEERC 16 .D Delight for a Cat (上下界的费用流)
ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡 ...
- BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流
题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...
- BZOJ 2055 80人环游世界 有上下界最小费用可行流
题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...
- [BZOJ2055]80人环游世界 有上下界最小费用最大流
2055: 80人环游世界 Time Limit: 10 Sec Memory Limit: 64 MB Description 想必大家都看过成龙大哥的<80天环游世界>,里面 ...
随机推荐
- 修改deploy location
在MyEclipse,如果某Web Project重命名后,项目名称有可能仍然是之前的名称. 修改路径: 第一, 路径:右击某Web Project,Properties->MyEclipse- ...
- C基础知识(10):预处理器
C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理. 所有的预处理器命令都是以井号(#)开 ...
- String与toString
String与toString能将对象转为字符串: 类型 行为描述 Array 将 Array 的每个元素转换为字符串,并将它们依次连接起来,两个元素之间用英文逗号作为分隔符进行拼接. Boolean ...
- java8:(Lambda 表达式,Supplier,@FunctionalInterface,foreach(),Optional,Stream().collect,双冒号,joining,partitioningBy分区,collectingAndThen,filter())
1.Lambda 表达式: 引导:http://www.cnblogs.com/yulinfeng/p/8452379.html DEMO1: List<String> names1 = ...
- 【HANA系列】SAP HANA SQL获取某字符串的位置
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL获取某字 ...
- tyan 3+1+15 远程
直接修改好BIOS,输入IP即可访问,帐号anonymous 这个登录 也就是为空,直接写入密码,登录即可
- jenkins自动化部署springboot
一.linux按jar包名称部署 1.执行shell PID=$(ps -ef | grep app.jar | grep -v grep | awk '{ print $2 }') if [ -z ...
- node.js中的url.parse方法使用说明
node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...
- C++多线程基础学习笔记(一)
下面分三个方面多线程技术的必须掌握一些基本知识. 1.进程 2.线程 3.并发 (1)进程 一个可执行程序运行起来了,即为创建了一个进程.如在电脑上打开了word,就创建了一个word进程,打开QQ, ...
- python 操作mongodb 文件相关
https://api.mongodb.com/python/current/tutorial.html# 文档地址 from pymongo import MongoClientfrom gridf ...