题目链接:

pid=2686">http://acm.hdu.edu.cn/showproblem.php?pid=2686

POJ3422一样

删掉K把汇点与源点的容量改为2(由于有两个方向的选择)就可以

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
const int maxn = 20000;
const int maxm = 800000;
const int inf = 1e8;
const int INF = 0x3f3f3f3f;
#define MIN INT_MIN
#define MAX 1e6
#define LL long long
#define init(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i = a;i<b;i++)
#define max(a,b) (a>b)?(a):(b)
#define min(a,b) (a>b)?(b):(a)
using namespace std;
struct node
{
int u,v,w,cap,next;
} edge[maxm];
int pre[maxn],dis[maxn],head[maxn],cnt;
bool vis[maxn];
int n;
void add(int u,int v,int c,int cap)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=c;
edge[cnt].cap=cap;
edge[cnt].next=head[u];
head[u]=cnt++; edge[cnt].u=v;
edge[cnt].v=u;
edge[cnt].w=-c;
edge[cnt].cap=0;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int spfa(int s,int t)
{
queue<int>q;
while(q.empty()==false) q.pop();
q.push(s);
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
FOR(i,s,t+1)
dis[i] = -1;//求最长路dis数组初始化为-1 dis[s]=0;
vis[s] = 1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u] = 0;
for(int i=head[u]; i!=-1; i=edge[i].next)
{
if(edge[i].cap && dis[edge[i].v] < (dis[u]+edge[i].w))//求最长路
{
dis[edge[i].v] = dis[u]+edge[i].w;
pre[edge[i].v] = i;
if(!vis[edge[i].v])
{
vis[edge[i].v]=1;
q.push(edge[i].v);
}
}
} }
if(dis[t] != -1)//------------------忘改了。 。 return 1;
else
return 0;
}
int MinCostMaxFlow(int s,int t)
{
int flow=0,cost=0;
while(spfa(s,t))
{
int df = inf;
for(int i = pre[t]; i!=-1; i=pre[edge[i].u])
{
if(edge[i].cap<df)
df = edge[i].cap;
}
flow += df;
for(int i=pre[t]; i!=-1; i=pre[edge[i].u])
{
edge[i].cap -= df;
edge[i^1].cap += df;
}
//printf("df = %d\n",df);
cost += dis[t] * df;
}
return cost;
}
void initt()
{
cnt=0;
memset(head,-1,sizeof(head));
} int ma;
int main()
{
int s,t,k;
while(~scanf("%d",&n))
{
initt();
s = 0;
t=2*n*n+1;
add(s,1,0,2);
int num = n*n;
FOR(i,1,n+1)
{
FOR(j,1,n+1)
{
scanf("%d",&ma);
add((i-1)*n+j,(i-1)*n+j+num,ma,1);
add((i-1)*n+j,(i-1)*n+j+num,0,1);//本点与拆点连线,费用0。容量为无穷 if(i<=n-1)//向下建图
{
add((i-1)*n+j+num,i*n+j,0,1);
}
if(j<=n-1)//向右建图
{
add((i-1)*n+j+num,(i-1)*n+j+1,0,1);
}
}
}
add(t-1,t,0,2); int ans = MinCostMaxFlow(s,t);
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. Qt链接网站SLOT
  2. 团队项目--站立会议 DAY4
  3. Embeding Python &amp; Extending Python with FFPython
  4. angularjs如何在ng-repeat过程中控制字符串长度超过指定长度后面内容以省略号显示
  5. xCode6制作动态及静态Framework(转)
  6. shell 各种循环判断
  7. keras04 GAN simple
  8. 题解:LOJ540游戏
  9. Oracle DBLINK的相关知识整理
  10. 使用Ncat反弹Shell
  11. scrapy流程
  12. Oracle 11g 测试ogg中断之后,重新同步操作
  13. tomcat (选号)公司tomcat无页面解决
  14. 『TensorFlow』单&amp;双隐藏层自编码器设计
  15. problem:浏览器如何区分html超文本和普通文本
  16. ALTER语句重命名,重新定义和重新排序列
  17. 20181108 Apache Commons Lang
  18. 如何用prometheus监控k8s集群中业务pod的metrics
  19. ECNU 3260 - 袋鼠妈妈找孩子
  20. CF585D Lizard Era: Beginning

热门文章

  1. java中继承关系学习小结
  2. Chromium网页输入事件捕捉和手势检測过程分析
  3. 开发效率必备之Mac双屏显示
  4. UITableView属性 自己定义UITableViewCell
  5. 第6章7节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
  6. poj3685(嵌套二分)
  7. c语言循环案例
  8. 35.QT蝴蝶飞舞
  9. [转]数据库事务中的隔离级别和锁+spring Transactional注解
  10. Nosql的实际应用场景