zoukankan      html  css  js  c++  java
  • poj 2987 Firing (最大权 闭合 图)

    http://poj.org/problem?id=2987

    题意:

    公司要由于经济 问题 要 裁员工,已知,要采取某个 员工,那么 他的下属也将被 裁去,给出  裁出 n  个员公的 所获的利益 (可负 可正) ,员工之间的关系 i j,

    i  以 j  做为  他的下属  求在获得 最大利益的情况下 ,最少 裁 多少人  。

    输出 裁的人数 和 利益  。 

    题接:  因为 员工 i  以 其上司的 存在 而 存在, 所以 他们 之间 有  依赖关系 , 可应用   最大权闭合图,求解 。

    View Code
      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cmath>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<set>
      7 #include<map>
      8 #include<queue>
      9 #include<vector>
     10 #include<string>
     11 #define Min(a,b) a<b?a:b
     12 #define Max(a,b) a>b?a:b
     13 #define CL(a,num) memset(a,num,sizeof(a));
     14 #define maxn  5100
     15 #define eps  1e-6
     16 #define inf  10000000000
     17 #define read() freopen("data.in","r",stdin) ;
     18 #define ll __int64
     19 using namespace std;
     20 ll n , m ;
     21 struct node
     22 {
     23     int from;
     24     int to ;
     25     ll flow ;
     26     int next ;
     27 } p[maxn*20];
     28 int  head[maxn] ,s,t,cnt,dis[maxn];
     29 ll a[maxn]  ,ans,num,sum;
     30 
     31 bool vis[maxn] ;
     32 
     33 queue<int>que ;
     34 void add(int from ,int to , ll flow )
     35 {
     36     p[cnt].to = to ;
     37     p[cnt].flow =flow ;
     38     p[cnt].next = head[from] ;
     39     head[from] = cnt++ ;
     40 
     41     p[cnt].to = from ;
     42     p[cnt].flow = 0 ;
     43     p[cnt].next  = head[to] ;
     44     head[to] = cnt++ ;
     45 
     46 }
     47 
     48 int bfs()
     49 {
     50     CL(dis,-1)  ;
     51     dis[s] =  0 ;
     52     int i ;
     53     while(!que.empty())que.pop() ;
     54 
     55     que.push(s) ;
     56     while(!que.empty())
     57     {
     58         int u = que.front() ;que.pop() ;
     59 
     60         for(i = head[u] ; i != -1  ;i = p[i].next)
     61         {
     62                int v = p[i].to ;
     63 
     64                ll flow  = p[i].flow ;
     65 
     66                if(flow > 0)
     67                if(dis[v] < 0 )
     68                {
     69                    dis[v] = dis[u] + 1 ;
     70                    que.push(v) ;
     71                }
     72 
     73         }
     74 
     75     }
     76 
     77     if(dis[t] > 0return 1;
     78     else return 0 ;
     79 
     80 
     81 
     82 }
     83 
     84 
     85 ll dfs(int x,ll mx)
     86 {
     87 
     88 
     89     if(x == t) return mx ;
     90 
     91     int i ;
     92     ll a ,tf = 0;
     93 
     94 
     95      for(i = head[x] ; i != -1 ; i = p[i].next)
     96      {
     97          int v = p[i].to ;
     98          ll  flow  = p[i].flow ;
     99          if(flow > 0)
    100          {
    101               if( dis[v] == dis[x] + 1 && (a = dfs(v,min(flow ,mx))))
    102            {
    103               p[i].flow -= a ;
    104               p[i^1].flow += a;
    105 
    106             return a ;
    107            }
    108 
    109          }
    110 
    111      }
    112 
    113 
    114      if(!tf) dis[x] = - 1;
    115      return tf ;
    116 
    117 }
    118 void dfs1(int x)
    119 {
    120 
    121 
    122     vis[x] = true ;
    123     num++;
    124 
    125     for(int i = head[x] ;i != -1;i = p[i].next)
    126     {
    127          int v = p[i].to ;
    128         if(!vis[v] && p[i].flow > 0)
    129             dfs1(v) ;
    130     }
    131 }
    132 void dinic()
    133 {
    134 
    135     ans = 0 ;
    136     ll res = 0 ;
    137     while(bfs())
    138     {
    139         while(res = dfs(s,inf))ans += res ;
    140     }
    141 
    142     CL(vis,false) ;
    143 
    144     num = 0 ;
    145     dfs1(s) ;
    146 
    147     printf("%I64d %I64d\n",num - 1,sum - ans) ;
    148 
    149 
    150 }
    151 int main()
    152 {
    153     int i,x,y ;
    154 
    155     //read() ;
    156     while(scanf("%I64d%I64d",&n,&m)!=EOF)
    157     {
    158         CL(head,-1) ;
    159         cnt =  0 ;
    160         sum = 0 ;
    161         for(i = 1 ; i <= n;i++)
    162         {
    163             scanf("%I64d",&a[i]) ;
    164             if(a[i] > 0)sum += a[i] ;
    165         }
    166 
    167         for(i = 0 ; i < m;i++)
    168         {
    169             scanf("%d%d",&x,&y);
    170             add(x,y,inf) ;
    171         }
    172         s = 0 ;
    173         t = n + 1 ;
    174         for(i = 1 ;i <= n;i++)
    175         {
    176             if(a[i] >0)
    177             {
    178                 add(s,i,a[i]);
    179             }
    180             else
    181             {
    182                 add(i,t,-a[i]) ;
    183             }
    184         }
    185 
    186         dinic() ;
    187 
    188     }
    189 }
  • 相关阅读:
    Cocos2d-html5 笔记2: director
    Cocos2d html5 笔记 1: overview
    Device Pixel Ratio & Media Queries
    Viewport
    Viewport解决分辨率适配问题
    Ajax缓存解决办法
    capitalize()
    chr() 、ord()
    oct()
    eval()
  • 原文地址:https://www.cnblogs.com/acSzz/p/2752347.html
Copyright © 2011-2022 走看看