zoukankan      html  css  js  c++  java
  • hdu 1565

    想通过这题来学最大点权独立集,不过貌似可以直接做?(结果没学成= =)

    黑白染色并分别连ST,容量为权值,然后相邻格子连边,容量INF

    看到中文题目激动了忘了有多组数据(雾

     1 //#include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<queue>
     7 #define inc(i,l,r) for(int i=l;i<=r;i++)
     8 #define dec(i,l,r) for(int i=l;i>=r;i--)
     9 #define link(x) for(edge *j=h[x];j;j=j->next)
    10 #define mem(a) memset(a,0,sizeof(a))
    11 #define inf 1e9
    12 #define ll long long
    13 #define succ(x) (1<<x)
    14 #define NM 1000
    15 #define nm 10000
    16 using namespace std;
    17 int read(){
    18     int x=0,f=1;char ch=getchar();
    19     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    20     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    21     return x*f;
    22 }
    23 struct edge{
    24     int t,v;
    25     edge *next,*rev;
    26 }e[nm],*h[NM],*p=e;
    27 void _add(int x,int y,int v){
    28     p->t=y;p->v=v;p->next=h[x];h[x]=p;p++;
    29 }
    30 void add(int x,int y,int v){
    31     _add(x,y,v);_add(y,x,0);
    32     h[x]->rev=h[y];h[y]->rev=h[x];
    33 }
    34 int n,m,s,_t,_x,d[NM],b[30][30],tot;
    35 const int dir[4][2]={0,1,1,0,0,-1,-1,0};
    36 queue<int >q;
    37 bool check(int x){
    38     return x>=1&&x<=n;
    39 }
    40 int bfs(){
    41     mem(d);
    42     d[0]++;q.push(0);
    43     while(!q.empty()){
    44         int t=q.front();q.pop();
    45         link(t)
    46         if(j->v&&!d[j->t])
    47         d[j->t]=d[t]+1,q.push(j->t);
    48     }
    49     return d[n];
    50 }
    51 int dfs(int x,int k){
    52     int _a;
    53     if(x==n)return k;
    54     link(x)
    55     if(j->v&&d[j->t]==d[x]+1&&(_a=dfs(j->t,min(j->v,k)))){
    56         j->v-=_a;j->rev->v+=_a;return _a;
    57     }
    58     return 0;
    59 }
    60 int main(){
    61 //    freopen("data.in","r",stdin);
    62     while(scanf("%d",&n)!=EOF){
    63         tot=s=0;mem(b);p=e;mem(h);
    64     inc(i,1,n)
    65     inc(j,1,n)
    66     b[i][j]=++tot;
    67     inc(i,1,n) 
    68     inc(j,1,n){
    69         _x=read();s+=_x;
    70         if((i+j)%2)add(b[i][j],tot+1,_x);
    71         else{
    72             add(0,b[i][j],_x);
    73         inc(k,0,3)
    74         if(check(i+dir[k][0])&&check(j+dir[k][1]))
    75         add(b[i][j],b[i+dir[k][0]][j+dir[k][1]],inf);
    76         }
    77     }
    78     n=tot+1;
    79     while(bfs())
    80     if(_t=dfs(0,inf))s-=_t;
    81     printf("%d
    ",s);
    82 }
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    Python学习【第五篇】:面向对象及相关
    Python之路【第四篇】:模块
    Python之路【第三篇】:python基础(二)
    Python之路【第二篇】:Python基础(一)
    Python之路【第一篇】:Python简介和入门
    Open-source Tutorial
    Algorithms
    Mathematics Base
    Mathematics Base
    Open-source Tutorial
  • 原文地址:https://www.cnblogs.com/onlyRP/p/5086773.html
Copyright © 2011-2022 走看看