zoukankan      html  css  js  c++  java
  • poj2195 Going Home

    传送门 

    C++ CE G++ AC什么鬼...

    这题虽说是网络流 但是可以用之前的KM最优匹配做

    会的话还是比较好写的

    这里也发现了最大流/费用流更适合离散图 匈牙利/KM更适合稀疏图

    Code:

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<cmath>
      5 #include<queue>
      6 #define ms(a,b) memset(a,b,sizeof a)
      7 #define rep(i,a,n) for(int i = a;i <= n;i++)
      8 #define per(i,n,a) for(int i = n;i >= a;i--)
      9 #define inf 2147483647
     10 using namespace std;
     11 typedef long long ll;
     12 typedef double D;
     13 #define eps 1e-8
     14 ll read() {
     15     ll as = 0,fu = 1;
     16     char c = getchar();
     17     while(c < '0' || c > '9') {
     18         if(c == '-') fu = -1;
     19         c = getchar();
     20     }
     21     while(c >= '0' && c <= '9') {
     22         as = as * 10 + c - '0';
     23         c = getchar();
     24     }
     25     return as * fu;
     26 }
     27 //head
     28 const int N = 1005;
     29 int n,m;
     30 char cmd[N];
     31 
     32 struct node {
     33     int x,y;
     34 }a[N],b[N];
     35 int top1,top2;
     36 int dis(node a,node b) {
     37     return abs(a.x-b.x) + abs(a.y-b.y);
     38 }
     39 void input() {
     40     top1 = top2 = 0;
     41     rep(i,1,n) {
     42         scanf("%s",cmd+1);
     43         rep(j,1,m) {
     44             if(cmd[j] == 'm') a[++top1] = (node){i,j};
     45             if(cmd[j] == 'H') b[++top2] = (node){i,j};
     46         }
     47     }
     48 }
     49 
     50 int v[N][N],ans;
     51 int lx[N],ly[N];
     52 int match[N];
     53 bool s[N],t[N];
     54 bool dfs(int x) {
     55     s[x] = 1;
     56     rep(y,1,n) {
     57         if(lx[x] + ly[y] == v[x][y] && !t[y]) {
     58             t[y] = 1;
     59             if(!match[y] || dfs(match[y])) {
     60                 match[y] = x;
     61                 return 1;
     62             }
     63         }
     64     }
     65     return 0;
     66 }
     67 
     68 void update() {
     69     int flw = inf;
     70     rep(x,1,n) if(s[x]) {
     71         rep(y,1,n) if(!t[y]) {
     72             flw = min(flw,lx[x] + ly[y] - v[x][y]);
     73         }
     74     }
     75     rep(i,1,n) {
     76         if(s[i]) lx[i] -= flw;
     77         if(t[i]) ly[i] += flw;
     78     }
     79 }
     80 
     81 void KM() {
     82     rep(i,1,n) {
     83         match[i] = lx[i] = ly[i] = 0;
     84         rep(j,1,n) lx[i] = max(lx[i],v[i][j]);
     85     }
     86     rep(i,1,n) {
     87         while(1) {
     88             rep(j,1,n) s[j] = t[j] = 0;
     89             if(dfs(i)) break;
     90             update();
     91         }
     92     }
     93 }
     94 
     95 int main() {
     96     while(~scanf("%d%d",&n,&m) && n && m) {
     97         input(),n = top1;
     98         rep(i,1,n) rep(j,1,n) v[i][j] = -dis(a[i],b[j]);
     99         KM(),ans = 0;
    100         rep(i,1,n) ans += lx[i] + ly[i];
    101         printf("%d
    ",-ans);
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    短信编码总结
    在Linux下用C语言实现短信收发
    sshd_config配置详解
    SSH的通讯和认证
    linux安装tacacs+服务器
    Tacacs+认证详细调研
    伪分布配置完成启动jobtracker和tasktracker没有启动
    Hadoop学习记录(7)|Eclipse远程调试Hadoop
    Hadoop学习记录(6)|Eclipse安装Hadoop 插件
    Hadoop学习记录(5)|集群搭建|节点动态添加删除
  • 原文地址:https://www.cnblogs.com/yuyanjiaB/p/10028379.html
Copyright © 2011-2022 走看看