#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std; const int maxe = ;
const int maxn = ;
const int INF = 0x3f3f3f3f; struct Edge{
int u,v,flow,cap,cost;
int next;
Edge(int u=,int v=,int flow=,int cap=,int cost=,int next=):
u(u), v(v), flow(flow), cap(cap), cost(cost), next(next){}
}; struct MCMF{
Edge edges[maxe];
int head[maxn],cnt;
int d[maxn];
bool inq[maxn];
int pa[maxn];
int res[maxn]; void init(){
memset(head,-,sizeof(head));
cnt = ;
} void addedge(int u,int v,int cap,int cost){
edges[cnt] = Edge(u,v,,cap,cost,head[u]);
head[u] = cnt++;
edges[cnt] = Edge(v,u,,,-cost,head[v]);
head[v] = cnt++;
} bool SPFA(int s,int t,int& flow,int& cost){
memset(d,0x3f,sizeof(d));
memset(inq,,sizeof(inq)); queue<int> Q;
Q.push(s);
inq[s] = true; d[s] = ;
res[s] = INF; res[t] = ; while(!Q.empty()){
int u = Q.front(); Q.pop();
inq[u] = false; for(int i=head[u];i!=-;i=edges[i].next){
Edge& e = edges[i];
if(e.cap>e.flow && d[e.v] > d[u] + e.cost){
d[e.v] = d[u] + e.cost;
pa[e.v] = i;
res[e.v] = min(res[u],e.cap-e.flow);
if(!inq[e.v]){
Q.push(e.v);
inq[e.v] = true;
}
}
}
}
if(res[t] == ) return false;
flow += res[t];
cost += res[t]*d[t];
for(int i=t;i!=s;i=edges[pa[i]].u){
edges[pa[i]].flow += res[t];
edges[pa[i]^].flow -= res[t];
}
return true;
} int MinCost(int s,int t){
int flow = ,cost = ;
while(SPFA(s,t,flow,cost)){} return cost;
}
}solver; struct Node{
int x,y;
int dist;
Node(int x=,int y=,int dist = ): x(x), y(y) ,dist(dist) {}
};
Node Knight[];
int n,k,m;
int dist[][]; int Mymap[][]; // == 0代表rock,-1代表space ,1-m代表mill.
int next_x[] = {-,,,};
int next_y[] = {,-,,}; void bfs(){
bool vis[][];
memset(dist,0x3f,sizeof(dist));
queue<Node> Q;
for(int i=;i<=k;i++){
while(!Q.empty()) Q.pop();
Q.push(Node(Knight[i].x,Knight[i].y,)); memset(vis,,sizeof(vis));
vis[Knight[i].x][Knight[i].y] = true; while(!Q.empty()){
Node out = Q.front(); Q.pop();
for(int j=;j<;j++){
int x = out.x + next_x[j];
int y = out.y + next_y[j];
if(vis[x][y]) continue;
vis[x][y] = true;
if(Mymap[x][y] == -){
Q.push(Node(x,y,out.dist+));
}
else if(Mymap[x][y]>){
dist[i][Mymap[x][y]] = out.dist+;
Q.push(Node(x,y,out.dist+));
}
}
}
}
} int main()
{
//freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
for(int cas=;cas<=T;cas++){
cin>>n>>k>>m;
char ch[];
memset(Mymap,,sizeof(Mymap));
int cntm = ;
for(int i=;i<=n;i++){
scanf("%s",ch+);
for(int j=;j<=n;j++){
if(ch[j]>='A' && ch[j]<='Z'){
int num = ch[j] - 'A' + ;
Knight[num] = Node(i,j,);
Mymap[i][j] = -;
}
else if(ch[j] == 'm'){
Mymap[i][j] = cntm++;
}
else if(ch[j] == '.'){
Mymap[i][j] = -;
}
}
}
bfs();
solver.init();
int s = , t = k+m+;
for(int i=;i<=k;i++){
int a;
scanf("%d",&a);
solver.addedge(s,i,a,);
}
for(int i=;i<=k;i++)
for(int j=;j<=m;j++){
solver.addedge(i,k+j,,dist[i][j]);
} for(int i=;i<=m;i++){
solver.addedge(k+i,t,,);
} printf("Case %d: %d\n",cas,solver.MinCost(s,t));
}
}

lightoj 1243 - Guardian Knights 最小费用流的更多相关文章

  1. LightOJ 1315 - Game of Hyper Knights(博弈sg函数)

    G - Game of Hyper Knights Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & ...

  2. Lightoj 1010 - Knights in Chessboard

    1010 - Knights in Chessboard    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ...

  3. Lightoj 1010 - Knights in Chessboard (胡搞)

    题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1010 题目描述: 有一个n*m的棋盘,根据象棋中马走日字的规则,问此棋盘最多 ...

  4. LightOJ - 1010 Knights in Chessboard(规律)

    题目链接:https://vjudge.net/contest/28079#problem/B 题目大意:给你一个nxm的棋盘,问你最多可以放几个骑士让他们互相攻击不到.骑士攻击方式如下图: 解题思路 ...

  5. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...

  6. lightoj 1010 (水题,找规律)

    lightoj 1010 Knights in Chessboard 链接:http://lightoj.com/volume_showproblem.php?problem=1010 题意:国际象棋 ...

  7. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  8. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  9. POJ 2942 Knights of the Round Table

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 10911   Acce ...

随机推荐

  1. C#字符串颠倒输出

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  2. framework 4.5.1安装时发生严重错误

    http://jingyan.baidu.com/article/a501d80c0a74b4ec630f5ee5.html http://jingyan.baidu.com/article/d807 ...

  3. c#中用DirectShow实现媒体播放器的核心(1) DirectShow简介

    用.net做多媒体开发的似乎不多,所以网上资源也少,看的人更少.不过我的博客上居然还有几位在等新文章的人,有点出乎我的意料了.目前我已不再从事多媒体相关的工作,加入新公司至今都忙到吐血,再加上害怕水平 ...

  4. Flex基础相关

    本篇文章转载于http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html,原作者阮一峰. 网页布局(layout)是CSS的一个重点应用. 布局的 ...

  5. nodejs框架express4.x 学习--安装篇

    一.安装建立项目 1.安装nodejs 2.安装express(全局) npm install -g express 默认安装的是4.12.4 3.由于在3.6版本之后项目构建器被单独拆分出来,所以还 ...

  6. 新建线程与UI线程间的通信

    现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入 ...

  7. php微信2 获取自定义菜单中的access_token

    //自定义菜单中获取access_token    static function get_access_token($appid,$secret){        $url="https: ...

  8. 《paste命令》-linux命令五分钟系列之二十

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  9. 子网/ip/子网掩码

    IP地址由网络地址和主机地址组成 而现在IP由“子网掩码”通过子网网络地 址细分出 A,B,C类更小的网络.这种方式 实际上就是将原来的A类,B类,C类等分类 中的的主机地址部分用作子网地址,可以 将 ...

  10. Memcache,Redis

    Memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. ...