• HDU3395 Special Fish(最大费用任意流)


    题目要的并不是最大匹配下得到的最大的结果。

    网上流行的做法是加边。其实,在连续增广的时候求得一个可行流的总费用为负就停止这样就行了。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include<algorithm>
     5 using namespace std;
     6 #define INF (1<<30)
     7 #define MAXN 222
     8 #define MAXM 22222
     9 struct Edge{
    10     int u,v,cap,cost,next;
    11 }edge[MAXM];
    12 int head[MAXN];
    13 int NV,NE,vs,vt;
    14 
    15 void addEdge(int u,int v,int cap,int cost){
    16     edge[NE].u=u; edge[NE].v=v; edge[NE].cap=cap; edge[NE].cost=cost;
    17     edge[NE].next=head[u]; head[u]=NE++;
    18     edge[NE].u=v; edge[NE].v=u; edge[NE].cap=0; edge[NE].cost=-cost;
    19     edge[NE].next=head[v]; head[v]=NE++;
    20 }
    21 bool vis[MAXN];
    22 int d[MAXN],pre[MAXN];
    23 bool SPFA(){
    24     for(int i=0;i<NV;++i){
    25         vis[i]=0;
    26         d[i]=INF;
    27     }
    28     vis[vs]=1;
    29     d[vs]=0;
    30     queue<int> que;
    31     que.push(vs);
    32     while(!que.empty()){
    33         int u=que.front(); que.pop();
    34         for(int i=head[u]; i!=-1; i=edge[i].next){
    35             int v=edge[i].v;
    36             if(edge[i].cap && d[v]>d[u]+edge[i].cost){
    37                 d[v]=d[u]+edge[i].cost;
    38                 pre[v]=i;
    39                 if(!vis[v]){
    40                     vis[v]=1;
    41                     que.push(v);
    42                 }
    43             }
    44         }
    45         vis[u]=0;
    46     }
    47     return d[vt]!=INF;
    48 }
    49 int MCMF(){
    50     int res=0;
    51     while(SPFA()){
    52         int flow=INF,cost=0;
    53         for(int u=vt; u!=vs; u=edge[pre[u]].u){
    54             flow=min(flow,edge[pre[u]].cap);
    55         }
    56         for(int u=vt; u!=vs; u=edge[pre[u]].u){
    57             edge[pre[u]].cap-=flow;
    58             edge[pre[u]^1].cap+=flow;
    59             cost+=flow*edge[pre[u]].cost;
    60         }
    61         if(cost>=0) break;
    62         res+=cost;
    63     }
    64     return res;
    65 }
    66 int main(){
    67     int n,a[111],b;
    68     while(~scanf("%d",&n)&&n){
    69         for(int i=1;i<=n;++i) scanf("%d",a+i);
    70         vs=0; vt=n<<1|1; NV=vt+1; NE=0;
    71         memset(head,-1,sizeof(head));
    72         for(int i=1;i<=n;++i){
    73             addEdge(vs,i,1,0);
    74             addEdge(i+n,vt,1,0);
    75         }
    76         for(int i=1;i<=n;++i){
    77             for(int j=1;j<=n;++j){
    78                 scanf("%1d",&b);
    79                 if(b) addEdge(i,j+n,1,-(a[i]^a[j]));
    80             }
    81         }
    82         printf("%d
    ",-MCMF());
    83     }
    84     return 0;
    85 }
  • 相关阅读:
    spring @Transactional 事务注解
    vue 父子组件的方法调用
    spring boot使用TestRestTemplate集成测试 RESTful 接口
    JS实现网站内容的禁止复制和粘贴、另存为
    vue把localhost改成ip地址无法访问—解决方法
    spring mvc spring boot 允许跨域请求 配置类
    JIRA安装过程中链接mysql的问题!
    vue开发中v-for在Eslint的规则检查下出现:Elements in iteration expect to have 'v-bind:key' directives
    Linux进程启动/指令执行方式研究
    反弹Shell原理及检测技术研究
  • 原文地址:https://www.cnblogs.com/WABoss/p/4852052.html
Copyright © 2020-2023  润新知