zoukankan      html  css  js  c++  java
  • Bzoj1324 Exca王者之剑

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 591  Solved: 296

    Description

     

    Input

    第一行给出数字N,M代表行列数.N,M均小于等于100 下面N行M列用于描述数字矩阵

    Output

    输出最多可以拿到多少块宝石

    Sample Input

    2 2
    1 2
    2 1

    Sample Output

    4

    HINT

     

    Source

    图论 网络流

    将图二分染色

    求最大点权独立集

    最大点权独立集就等于总权值和减去最小权值覆盖

    最小权值覆盖就是建好二分图以后的最小割

    也就是说这是道模板题

    然而我居然没有1A,原因是反向弧的流量建成了w而不是0

    真鸡儿丢人,我退群吧

      1 /*by SilverN*/
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<cmath>
      7 #include<vector>
      8 #include<queue>
      9 using namespace std;
     10 const int INF=0x3f3f3f3f;
     11 const int mxn=100010;
     12 const int mx[5]={0,1,0,-1,0};
     13 const int my[5]={0,0,1,0,-1};
     14 int read(){
     15     int x=0,f=1;char ch=getchar();
     16     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     17     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
     18     return x*f;
     19 }
     20 struct edge{
     21     int v,nxt,f;
     22 }e[mxn<<1];
     23 int hd[mxn],mct=1;
     24 void add_edge(int u,int v,int w){
     25     e[++mct].v=v;e[mct].nxt=hd[u];e[mct].f=w; hd[u]=mct;return;
     26 }
     27 void insert(int u,int v,int w){
     28     add_edge(u,v,w);add_edge(v,u,0);return;
     29 }
     30 queue<int>q;
     31 int d[mxn];
     32 int n,m,S,T;
     33 bool BFS(){
     34     memset(d,0,sizeof d);
     35     d[S]=1;
     36     q.push(S);
     37     while(!q.empty()){
     38         int u=q.front();q.pop();
     39         for(int i=hd[u];i;i=e[i].nxt){
     40             int v=e[i].v;
     41             if(e[i].f && !d[v]){
     42                 d[v]=d[u]+1;
     43                 q.push(v);
     44             }
     45         }
     46     }
     47     return d[T];
     48 }
     49 int DFS(int u,int lim){
     50     if(u==T)return lim;
     51     int f=0,tmp;
     52     for(int i=hd[u],v;i;i=e[i].nxt){
     53         v=e[i].v;
     54         if(d[v]==d[u]+1 && e[i].f && (tmp=DFS(v,min(lim,e[i].f)))){
     55             e[i].f-=tmp;  e[i^1].f+=tmp;
     56             lim-=tmp;   f+=tmp;
     57             if(!lim)return f;
     58         }
     59     }
     60     d[u]=0;
     61     return f;
     62 }
     63 int Dinic(){
     64     int res=0;
     65     while(BFS())res+=DFS(S,0x3f3f3f3f);
     66     return res;
     67 }
     68 int id[120][120];
     69 int mp[120][120];
     70 int smm=0,dt=0;
     71 void solve(){
     72     int i,j;
     73     for(i=1;i<=n;i++)
     74         for(j=1;j<=m;j++)
     75             id[i][j]=++dt;
     76     S=0;T=dt+1;
     77     for(i=1;i<=n;i++)
     78         for(j=1;j<=m;j++){
     79             if((i+j)&1){
     80                 insert(S,id[i][j],mp[i][j]);
     81                 for(int k=1;k<=4;k++){
     82                     int nx=i+mx[k],ny=j+my[k];
     83                     if(nx>0 && nx<=n && ny>0 && ny<=m)
     84                         insert(id[i][j],id[nx][ny],INF);
     85                      
     86                 }
     87             }
     88             else insert(id[i][j],T,mp[i][j]);
     89         }
     90     return;
     91 }
     92 int main(){
     93     int i,j;
     94     n=read();m=read();
     95     for(i=1;i<=n;i++)
     96         for(j=1;j<=m;j++){
     97             mp[i][j]=read();
     98             smm+=mp[i][j];
     99         }
    100     solve();
    101     int res=Dinic();
    102 //  printf("Res:%d
    ",res);
    103     printf("%d
    ",smm-res);
    104     return 0;
    105 }
  • 相关阅读:
    CodeForces 446A. DZY Loves Sequences(最长上升子序列)
    CodeForces
    2020牛客暑期多校训练营(第一场)
    POJ3281-Dining(最大流)(拆点)
    「杂题」图论杂题选做
    「学习小结」CDQ 分治多维偏序问题
    「算法笔记」Tarjan 算法 双连通分量
    「算法笔记」状压 DP
    「算法笔记」数位 DP
    「算法笔记」矩阵乘法
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6629250.html
Copyright © 2011-2022 走看看