题目链接

关键在于建图,昨天做的的时候直接想错了。放了放,在路上和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(最小费用最大流+拆点)相关推荐

  1. poj 3422 Kaka's Matrix Travels(最小费用最大流)

    题目链接 Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9394   Accep ...

  2. pku 3422 Kaka's Matrix Travels 最大费用最大流

    http://poj.org/problem?id=3422 /* 题意:给定一个n*n的矩形方格,要求从(1,1)出发,只能往右下角走,(i + 1,j) 或者 (i + n,j)每次走完将格子里面 ...

  3. poj3422 Kaka's Matrix Travels(最小费用最大流问题)

    1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...

  4. POJ - 3422 Kaka's Matrix Travels(网络流-最大费用最大流+拆点法)

    题目链接:点击查看 题目大意:K取方格数,是在一个N*N的矩形网格中,每个格子里都写着一个整数.可以从左上角到右下角安排K条路线,每一步只能往下或往右,沿途经过的格子中的整数会被取走.若多条路线重复经 ...

  5. POJ 3422 Kaka's Matrix Travels | 费用流

    最初的想法是这样的,先走一条最大费用流,沿路回来把所有的点的权值更新为0,然后再跑最大费用流,嗯,好像很对.后来想想,这完全不符合网络流的思想啊Orz. 题意: 一个矩阵,每个grid都有一个权值.从 ...

  6. poj 3422 Kaka's Matrix Travels 费用流

    题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...

  7. POJ 3422 Kaka's Matrix Travels

    题目链接:ヾ(≧∇≦*)ゝ 大致题意:给你一个\(n*n\)的矩阵从\((1,1)\)出发,到\((n,n)\)结束,只能走右边或左边.每个点在被走过之后权值变成0,问走\(k\)次后,能获得的最大值 ...

  8. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理

    准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...

  9. hdu Kaka's Matrix Travels(最小费用最大流)

    把题意写一下:  给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...

  10. POJ3422 Kaka's Matrix Travels

    描述 On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels wi ...

最新文章

  1. Andrew Gelman、Aki Vehtari​ | 过去50年最重要的统计学思想是什么?
  2. Android中service应用
  3. Android项目工程中的Gradle、compileSdkVersion、buildToolsVersion
  4. springboot 之 webscoket 服务端推送
  5. Linux系统下UDP发送和接收广播消息小例子
  6. rest 验证demo_如何实现REST资源的输入验证
  7. 常用的JS与XML结合用法 简单示例
  8. html5表单的css修饰,如何使用CSS3美化HTML5表单
  9. 计算机系统结构自考应用题,2017年10月自考02325计算机系统结构真题及答案
  10. 管理新语:如果经验有用,大家都去养老院招人了
  11. python 生成器_彻底理解 Python 生成器
  12. 【电子相册制作软件】名编辑电子杂志大师教程 | 如何在翻页电子相册中添加动态的flash背景?
  13. 工程实践:基于C/C++的学生账目管理系统(个人账本管理系统)
  14. 关于自动拼接地图算法
  15. 2019年十大物联网安全事件
  16. docker-compose部署的服务访问https报错:x509: certificate signed by unknown authority
  17. 国产飞腾服务器制作raid
  18. bootstrapCDN地址
  19. python阶乘函数_python 阶乘函数
  20. amd服务器6300系列,AMD新款Opteron 6300服务器CPU评测

热门文章

  1. UML类图、代理学习
  2. 前端移动App开发环境搭建
  3. 计蒜客 2016计蒜之道比赛 初赛第四场 记录
  4. nginx 内置变量大全
  5. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性
  6. delegate(转)
  7. 使用powershell命令,为exchange 2007用户配置邮箱数据
  8. Mac如何解决vi vim光标移动慢问题
  9. [WebApi] 捣鼓一个资源管理器--文件下载
  10. vue组件化开发学习笔记-3-组件插槽