POJ 3422 Kaka's Matrix Travels(最小费用最大流+拆点)
题目链接
关键在于建图,昨天做的的时候直接想错了。放了放,在路上和gyx讨论了一下,他说是不是拆点,我一想真是啊。。。
然后想了想建图的细节。。。今天写了程序,居然把电脑给写挂了。。第一次啊,可见程序写的多不靠谱啊。。
把一个点拆成两个点,这两个点之间的流量为1,费用为权值,这条边的起点和终点都可以连接下个位置的起点。
为了控制流量,多加了k个点,这多出来的k个点,到终点的流量为1,来控制最终的流量。剩下的就是模版了,改了一下求最大。
这样建图效率不是很高,想会不会超时。。。果真TLE了,不过数组开小了,开大之后,水过400+ms。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <queue> 5 using namespace std; 6 #define INF 0x7fffffff 7 8 int p[51][51]; 9 10 int low[6001],path[6001]; 11 int first[6001],in[6001],dis[6001]; 12 int str,end,t; 13 struct node 14 { 15 int u,v,w,cost,re,next; 16 }edge[900001]; 17 int ans; 18 void CL() 19 { 20 t = 1; 21 memset(first,-1,sizeof(first)); 22 } 23 void add(int u,int v,int w,int cost) 24 { 25 edge[t].u = u; 26 edge[t].v = v; 27 edge[t].w = w; 28 edge[t].cost = cost; 29 edge[t].re = t+1; 30 edge[t].next = first[u]; 31 first[u] = t ++; 32 33 edge[t].u = v; 34 edge[t].v = u; 35 edge[t].w = 0; 36 edge[t].cost = -cost; 37 edge[t].re = t-1; 38 edge[t].next = first[v]; 39 first[v] = t ++; 40 } 41 int bfs() 42 { 43 int u,i,v; 44 memset(path,-1,sizeof(path)); 45 for(i = 0;i <= end;i ++) 46 { 47 dis[i] = -INF; 48 in[i] = 0; 49 } 50 queue<int>que; 51 que.push(str); 52 dis[str] = 0; 53 in[str] = 1; 54 low[str] = INF; 55 while(!que.empty()) 56 { 57 u = que.front(); 58 in[u] = 0; 59 que.pop(); 60 for(i = first[u];i != -1;i = edge[i].next) 61 { 62 v = edge[i].v; 63 if(edge[i].w&&dis[v] < dis[u]+edge[i].cost) 64 { 65 dis[v] = dis[u] + edge[i].cost; 66 path[v] = i; 67 low[v] = low[u] < edge[i].w ? low[u]:edge[i].w; 68 if(!in[v]) 69 { 70 que.push(v); 71 in[v] = 1; 72 } 73 } 74 } 75 } 76 if(path[end] == -1) 77 return -1; 78 else 79 return low[end]; 80 81 } 82 void mcmf() 83 { 84 int res,temp,now; 85 while((res = bfs()) != -1) 86 { 87 now = end; 88 while(now != str) 89 { 90 temp = path[now]; 91 edge[temp].w -= res; 92 edge[edge[temp].re].w += res; 93 ans += res*edge[temp].cost; 94 now = edge[temp].u; 95 } 96 } 97 } 98 int main() 99 { 100 int n,i,j,k; 101 int x,y; 102 ans = 0; 103 CL(); 104 scanf("%d %d",&n,&k); 105 for(i = 1;i <= n;i ++) 106 { 107 for(j = 1;j <= n;j ++) 108 scanf("%d",&p[i][j]); 109 } 110 str = 0; 111 end = 2*n*n + k + 1; 112 add(str,1,INF,0); 113 for(i = 1;i <= n;i ++) 114 { 115 for(j = 1;j <= n;j ++) 116 { 117 x = (i-1)*n + j; 118 y = x + n*n; 119 add(x,y,1,p[i][j]); 120 if(i + 1 <= n) 121 { 122 add(x,x+n,INF,0); 123 add(y,x+n,INF,0); 124 } 125 if(j + 1 <= n) 126 { 127 add(x,x+1,INF,0); 128 add(y,x+1,INF,0); 129 } 130 } 131 } 132 for(i = 1;i <= k;i ++) 133 { 134 add(x,2*n*n+i,INF,0); 135 add(y,2*n*n+i,INF,0); 136 add(2*n*n+i,end,1,0); 137 } 138 mcmf(); 139 printf("%d\n",ans); 140 return 0; 141 }
转载于:https://www.cnblogs.com/naix-x/archive/2013/02/27/2934840.html
POJ 3422 Kaka's Matrix Travels(最小费用最大流+拆点)相关推荐
- poj 3422 Kaka's Matrix Travels(最小费用最大流)
题目链接 Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9394 Accep ...
- pku 3422 Kaka's Matrix Travels 最大费用最大流
http://poj.org/problem?id=3422 /* 题意:给定一个n*n的矩形方格,要求从(1,1)出发,只能往右下角走,(i + 1,j) 或者 (i + n,j)每次走完将格子里面 ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...
- POJ - 3422 Kaka's Matrix Travels(网络流-最大费用最大流+拆点法)
题目链接:点击查看 题目大意:K取方格数,是在一个N*N的矩形网格中,每个格子里都写着一个整数.可以从左上角到右下角安排K条路线,每一步只能往下或往右,沿途经过的格子中的整数会被取走.若多条路线重复经 ...
- POJ 3422 Kaka's Matrix Travels | 费用流
最初的想法是这样的,先走一条最大费用流,沿路回来把所有的点的权值更新为0,然后再跑最大费用流,嗯,好像很对.后来想想,这完全不符合网络流的思想啊Orz. 题意: 一个矩阵,每个grid都有一个权值.从 ...
- poj 3422 Kaka's Matrix Travels 费用流
题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...
- POJ 3422 Kaka's Matrix Travels
题目链接:ヾ(≧∇≦*)ゝ 大致题意:给你一个\(n*n\)的矩阵从\((1,1)\)出发,到\((n,n)\)结束,只能走右边或左边.每个点在被走过之后权值变成0,问走\(k\)次后,能获得的最大值 ...
- BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...
- hdu Kaka's Matrix Travels(最小费用最大流)
把题意写一下: 给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...
- POJ3422 Kaka's Matrix Travels
描述 On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels wi ...
最新文章
- Andrew Gelman、Aki Vehtari​ | 过去50年最重要的统计学思想是什么?
- Android中service应用
- Android项目工程中的Gradle、compileSdkVersion、buildToolsVersion
- springboot 之 webscoket 服务端推送
- Linux系统下UDP发送和接收广播消息小例子
- rest 验证demo_如何实现REST资源的输入验证
- 常用的JS与XML结合用法 简单示例
- html5表单的css修饰,如何使用CSS3美化HTML5表单
- 计算机系统结构自考应用题,2017年10月自考02325计算机系统结构真题及答案
- 管理新语:如果经验有用,大家都去养老院招人了
- python 生成器_彻底理解 Python 生成器
- 【电子相册制作软件】名编辑电子杂志大师教程 | 如何在翻页电子相册中添加动态的flash背景?
- 工程实践:基于C/C++的学生账目管理系统(个人账本管理系统)
- 关于自动拼接地图算法
- 2019年十大物联网安全事件
- docker-compose部署的服务访问https报错:x509: certificate signed by unknown authority
- 国产飞腾服务器制作raid
- bootstrapCDN地址
- python阶乘函数_python 阶乘函数
- amd服务器6300系列,AMD新款Opteron 6300服务器CPU评测