poj 2195
来源:互联网 发布:腾讯游戏平台 mac版 编辑:程序博客网 时间:2024/05/16 23:59
#include<algorithm>#include<stdio.h>#include<vector>#include<queue>#include<string.h>using namespace std;const int INF = 1000;char a[101][101];typedef pair<int ,int>P ;struct edge{ int to ,cap,cost,rev;};int V;const int maxn = 1000;vector<edge>g[maxn];int h[maxn];int dist[maxn];int prevv[maxn],preve[maxn];int fabs(int x){ return x>0?x:-x;}struct node{ int x,y;} nodev[maxn];node nodeg[maxn];void add_edge(int from,int to,int cap,int cost){ g[from].push_back((edge) { to,cap,cost,g[to].size() }); g[to].push_back((edge) { from,0,-cost,g[from].size()-1 });}int min_cost_flow(int s,int t,int f){ int res = 0; fill(h,h+1+V,0); while(f>0) { priority_queue<P,vector<P>,greater<P> >que; fill(dist,dist+V+1,INF); dist[s] = 0; que.push(P(0,s)); while(!que.empty()) { P p = que.top(); que.pop(); int v = p.second; if(dist[v]<p.first) continue; for(int i = 0; i<g[v].size(); i++) { edge &e = g[v][i]; if(e.cap>0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]) { dist[e.to] = dist[v] +e.cost +h[v] - h[e.to]; prevv[e.to] = v; preve[e.to] = i; que.push(P(dist[e.to],e.to)); } } } if(dist[t]==INF) { return -1; } for(int v= 0; v<=V; v++) { h[v]+=dist[v]; } int d = f; for(int v = t; v!=s; v=prevv[v]) { d = min(d,g[prevv[v]][preve[v]].cap); } res+=d*h[t]; f-=d; for(int v = t; v!=s; v=prevv[v]) { edge &e = g[prevv[v]][preve[v]]; e.cap -=d; g[v][e.rev].cap+=d; } } return res;}int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF&&m&&n) { for(int i = 0;i<maxn;i++) g[i].clear(); int cot1 =1; int cot2=1; for(int i =1 ; i<=n; i++) { scanf("%s",a[i]+1); } for(int i = 1; i<=n; i++) { for(int j = 1; j<=m; j++) { if(a[i][j]=='m') { nodev[cot1].x = i; nodev[cot1].y = j; cot1++; } else { if(a[i][j]=='H') { nodeg[cot2].x=i; nodeg[cot2].y =j; cot2++; } } } } cot1--; cot2--; V = cot1*2+1; for(int i = 1; i<=cot1; i++) { add_edge(0,i,1,0); } for(int i = 1; i<=cot2; i++) { add_edge(cot1+i,2*cot1+1,1,0); } for(int i = 1; i<=cot1; i++) for(int j = 1; j<=cot2; j++) { add_edge(i,j+cot1,1,fabs(nodev[i].x-nodeg[j].x)+fabs(nodev[i].y - nodeg[j].y)); } printf("%d\n",min_cost_flow(0, V,cot1)); }}
0 0
- poj 2195
- poj 2195
- poj-2195
- poj 2195
- poj 2195
- poj 2195
- POJ 2195 Going Home
- POJ 2195 Going Home
- POJ-2195-Going Home
- poj 2195 java
- poj 2195 Going Home
- POJ 2195 min_cost_max_flow
- POJ 2195 Going Home
- poj 2195 Going Home
- POJ 2195 Going Home
- poj 2195 Going Home
- POJ 2195 Going Home
- POJ 2195 Going Home
- POJ 1442 Black Box(treap)
- MyEclipse设置自动提示
- Linux tcpdump命令详解
- 前几天用AnnotationSessionFactoryBean 注解方式代替*.hbm.xml时扫描映射实休文件后报错
- LeetCode 222. Count Complete Tree Nodes(完全二叉树节点数统计)
- poj 2195
- 用C#写的转换程序(将高版本项目转变成低版本)
- 错过了愚人节,还有清明节
- Java邮件发送
- js开发的45个人技巧
- 【算法】蛇形矩阵
- cocos开发环境配置
- 30.C语言结构体对齐访问
- PigPen:用Clojure写MapReduce Introducing PigPen: Map-Reduce for Clojure