Beispiel #1
0
int main() {
  int T, d, f, b;
  scanf("%d", &T);
  while(T--) {
    scanf("%d%d%d%d%d", &w, &h, &d, &f, &b);
    for(int i = 0; i < h; i++) scanf("%s", pool[i]);
    int cost = 0;
    for(int i = 0; i < h; i++) {
      if(pool[i][0] == '.') { pool[i][0] = '#'; cost += f; }
      if(pool[i][w-1] == '.') { pool[i][w-1] = '#'; cost += f; }
    }
    for(int i = 0; i < w; i++) {
      if(pool[0][i] == '.') { pool[0][i] = '#'; cost += f; }
      if(pool[h-1][i] == '.') { pool[h-1][i] = '#'; cost += f; }
    }
    g.init(h*w+2);
   
    for(int i = 0; i < h; i++)
      for(int j = 0; j < w; j++){
        if(pool[i][j] == '#') { // grass
          int cap = INF;
          if(i != 0 && i != h-1 && j != 0 && j != w-1) cap = d;
          g.AddEdge(h*w, ID(i,j), cap); // s->grass, cap=d or inf
        } else { // hole
          g.AddEdge(ID(i,j), h*w+1, f); // hole->t, cap=f
        }
        if(i > 0)   g.AddEdge(ID(i,j), ID(i-1,j), b);
        if(i < h-1) g.AddEdge(ID(i,j), ID(i+1,j), b);
        if(j > 0)   g.AddEdge(ID(i,j), ID(i,j-1), b);
        if(j < w-1) g.AddEdge(ID(i,j), ID(i,j+1), b);
      }
    printf("%d\n", cost + g.Maxflow(h*w, h*w+1));
  }
  return 0;
}
Beispiel #2
0
void run()
{
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
        scanf("%s",g1[i]+1);
    for(int i=1;i<=n;i++)
        scanf("%s",g2[i]+1);
    m=strlen(g1[1]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            g1[i][j]-='0';
    dinic.init(t);
    int sum = 0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g1[i][j]==0) continue;
            int u1 = id_p(i,j);
            int u2 = u1^1;
            dinic.AddEdge(u1,u2,g1[i][j]);
            for(int x=i-d;x<=i+d;x++)
                for(int y=j-d;y<=j+d;y++)
            {
                if(abs(x-i)+abs(y-j)>d || (x==i && y==j)) continue;
                if(!inside(x,y))
                {
                    dinic.AddEdge(u2,t,g1[i][j]);
                    goto bk;
                }
                else
                {
                    dinic.AddEdge(u2,id_p(x,y),g1[i][j]);
                }
            }
            bk:;
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g2[i][j]!='L')  continue;
            if(g1[i][j]==0 && canout(i,j))  continue;
            sum++;
            dinic.AddEdge(s,id_l(i,j),1);
            dinic.AddEdge(id_l(i,j),id_p(i,j),1);
        }
    int ans = sum - dinic.Maxflow(s,t);
    printf("Case #%d: ",cas++);  //cout<<sum<<' ';
    if(ans==0)  puts("no lizard was left behind.");
    else if(ans==1)  puts("1 lizard was left behind.");
    else printf("%d lizards were left behind.\n",ans);
}
Beispiel #3
0
void solve() {
    mp[1].clear();
    mp[2].clear();
    int n1 = 0, n2 = 0;
    for(int i = 1; i <= n; i++) {
        if(mp[1][a[i][1]] == 0) {
            n1++;
            mp[1][a[i][1]] = n1;
            b[i][1] = n1;
        }
        else {
            b[i][1] = mp[1][a[i][1]];
        }
        if(mp[2][a[i][2]] == 0) {
            n2++;
            mp[2][a[i][2]] = n2;
            b[i][2] = n2;
        }
        else {
            b[i][2] = mp[2][a[i][2]];
        }
    }
    g.init();
    int st = n1 + n2 + 1, ed = st + 1;
    for(int i = 1; i <= n1; i++) {
        g.addEdge(st, i, 1);
    }
    for(int i = 1; i <= n2; i++) {
        g.addEdge(i + n1, ed, 1);
    }
    for(int i = 1; i <= n; i++) {
        g.addEdge(b[i][1], n1 + b[i][2], 1);
    }
    int ans = g.Maxflow(st, ed, INF);
    //printf("%d  %d %d\n", n1, n2, ans);
    printf("%d\n", n - (n2 - ans) - n1);
}