[BZOJ 1066] 蜥蜴

来源:互联网 发布:定义一个变量sql 编辑:程序博客网 时间:2024/05/16 01:22

</pre>网络流拆点 非常基础的题 把柱子拆成两个点 再加入超级源点和超级汇点即可</p><p><span style="font-size:24px"></span><pre name="code" class="cpp">#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<cmath>#define MAXN 20#define MAXM 20const int INF = 0x3f3f3f3f;using namespace std;int ID, id[MAXN+10][MAXN+10];char Map[MAXN+10][MAXN+10], XX[MAXN+10][MAXN+10];int n, m, S, T, k;template <int maxn, int maxm>struct Isap{    int ecnt;    int d[maxn+10], pre[maxn+10], cur[maxn+10], gap[maxn+10];    int adj[maxn+10];    struct node {        int v, next, c, f;    }Edge[maxm*2+10];    void init() { memset(adj, -1, sizeof(adj)); ecnt = 0; }    void addedge(int u, int v, int c)    {        Edge[ecnt].v = v;        Edge[ecnt].c = c;        Edge[ecnt].f = 0;        Edge[ecnt].next = adj[u];        adj[u] = ecnt++;    }    void add(int u, int v, int c)    {        addedge(u, v, c);        addedge(v, u, 0);    }    void init_dis(int t)    {        queue <int> q;        memset(d, -1, sizeof(d));        memset(gap, 0, sizeof(gap));        d[t] = 0;        q.push(t);        while(!q.empty())        {            int u = q.front(); q.pop();            gap[d[u]]++;            for(int i = adj[u]; ~i; i = Edge[i].next)             {                int v = Edge[i].v;                if(d[v] == -1) { d[v] = d[u] + 1; q.push(v); }            }        }    }    int ISAP(int s, int t, int num)    {        init_dis(t);        int ans = 0, u = s;        int Flow = INF;        memcpy(cur, adj, sizeof(adj));        while(d[s] < num)        {            int &i = cur[u];            for(; ~i; i = Edge[i].next)            {                int v = Edge[i].v;                if(Edge[i].c > Edge[i].f && d[u] == d[v] + 1)                {                    u = v;                    pre[v] = i;                    Flow = min(Flow, Edge[i].c - Edge[i].f);                    if(u == t)                    {                         while(u != s) {                            int j = pre[u];                            Edge[j].f += Flow;                            Edge[j^1].f -= Flow;                            u = Edge[j^1].v;                        }                        ans += Flow;                        Flow = INF;                    }                    break;                }            }            if(i == -1)            {                if(--gap[d[u]] == 0) break;                int dmin = num - 1;                cur[u] = adj[u];                for(int j = adj[u]; ~j; j = Edge[j].next) if(Edge[j].c > Edge[j].f) dmin = min(dmin, d[Edge[j].v]);                d[u] = dmin+1;                gap[d[u]]++;                if(u != s) u = Edge[pre[u]^1].v;            }        }        return ans;    }};  Isap <MAXN*MAXN*4+10, MAXN*MAXN*MAXN*MAXN*2+10> sap;int cnt;double dis(int x1, int y1, int x2, int y2){    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}int main(){    sap.init();    scanf("%d%d%d", &n, &m, &k);    for(int i = 1; i <= n; i++) scanf("%s", Map[i]+1);    for(int i = 1; i <= n; i++) scanf("%s", XX[i]+1);    S = 2 * n * m + 1;    T = 2 * n * m + 2;    for(int i = 1; i <= n; i++)        for(int j = 1; j <= m; j++)        {            id[i][j] = ++ID;            if(XX[i][j] == 'L') { sap.add(S, id[i][j], 1); cnt++; }            if(Map[i][j] == '0') continue;            if(Map[i][j] > '0') sap.add(id[i][j], n*m+id[i][j], Map[i][j] - '0');for(int ii = 1; ii <= n; ii++)                for(int jj = 1; jj <= m; jj++)                    if(Map[ii][jj] > '0' && dis(i, j, ii, jj) <= k && !(ii == i && jj == j)){sap.add(n*m+id[i][j], id[ii][jj], INF);sap.add(n*m+id[ii][jj], id[i][j], INF);}            if(i <= k || n - k < i || j <= k || m - k < j) sap.add(n*m+id[i][j], T, INF);        }    int ans = sap.ISAP(S, T, n*m*2+2);    printf("%d", cnt - ans);}


0 0
原创粉丝点击