zoukankan      html  css  js  c++  java
  • HDU3996 Gold Mine 最大闭合权

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3996

      很无语加蛋碎的题目!题意描述不清,然后还有超int(这里wa,果断被坑)= =!方法很简单,很容易看出是最大闭合权。

      1 //STATUS:G++_AC_109MS_2068KB
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<string.h>
      5 #include<math.h>
      6 #include<iostream>
      7 #include<string>
      8 #include<algorithm>
      9 #include<vector>
     10 #include<queue>
     11 #include<stack>
     12 #include<map>
     13 using namespace std;
     14 #define LL __int64
     15 #define pii pair<int,int>
     16 #define Max(a,b) ((a)>(b)?(a):(b))
     17 #define Min(a,b) ((a)<(b)?(a):(b))
     18 #define mem(a,b) memset(a,b,sizeof(a))
     19 #define lson l,mid,rt<<1
     20 #define rson mid+1,r,rt<<1|1
     21 const int MAX=2510,INF=0x3f3f3f3f;
     22 const LL LLNF=0x3f3f3f3f3f3f3f3fLL;
     23 
     24 struct Edge{
     25     int u,v;
     26     LL cap;
     27 };
     28 
     29 vector<Edge> e;
     30 vector<int> g[MAX];
     31 int d[MAX],cur[MAX],p[MAX],num[MAX],val[MAX],ma[110][25],li[MAX][55][2],cou[MAX];
     32 int n,m,k,T,s,t,mt;
     33 
     34 void adde(int a,int b,LL val){
     35     e.push_back((Edge){a,b,val});
     36     g[a].push_back(mt++);
     37     e.push_back((Edge){b,a,0});
     38     g[b].push_back(mt++);
     39 }
     40 
     41 LL augment()
     42 {
     43     int x=t;
     44     LL a=LLNF;
     45     while(x!=s){
     46         a=Min(a,e[p[x]].cap);
     47         x=e[p[x]].u;
     48     }
     49     x=t;
     50     while(x!=s){
     51         e[p[x]].cap-=a;
     52         e[p[x]^1].cap+=a;
     53         x=e[p[x]].u;
     54     }
     55     return a;
     56 }
     57 
     58 LL isap()
     59 {
     60     int i,x,ok,min;
     61     LL flow=0;
     62     mem(d,0);mem(num,0);
     63     num[0]=t+1;
     64     mem(cur,0);
     65     x=s;
     66     while(d[s]<=t){
     67         if(x==t){
     68             flow+=augment();
     69             x=s;
     70         }
     71         ok=0;
     72         for(i=cur[x];i<g[x].size();i++){
     73             Edge& et=e[g[x][i]];
     74             if(et.cap && d[x]==d[et.v]+1){
     75                 ok=1;
     76                 p[et.v]=g[x][i];
     77                 cur[x]=i;
     78                 x=et.v;
     79                 break;
     80             }
     81         }
     82         if(!ok){
     83             min=t;
     84             for(i=0;i<g[x].size();i++){
     85                 Edge& et=e[g[x][i]];
     86                 if(et.cap && d[et.v]<min)min=d[et.v];
     87             }
     88             if(--num[d[x]]==0)break;
     89             num[d[x]=min+1]++;
     90             cur[x]=0;
     91             if(x!=s)x=e[p[x]].u;
     92         }
     93     }
     94     return flow;
     95 }
     96 
     97 void bfs()
     98 {
     99     int x,i,j;
    100     mem(d,0);
    101     queue<int> q;
    102     q.push(s);
    103     d[s]=1;
    104     while(!q.empty()){
    105         x=q.front();q.pop();
    106         for(i=0;i<g[x].size();i++){
    107             Edge& et=e[g[x][i]];
    108             if(et.cap && !d[et.v]){
    109                 d[et.v]=1;
    110                 q.push(et.v);
    111             }
    112         }
    113     }
    114 }
    115 
    116 int main()
    117 {
    118   //  freopen("in.txt","r",stdin);
    119     int i,j,q,x,y,ca=0;
    120     LL ans;
    121     scanf("%d",&T);
    122     while(T--)
    123     {
    124         k=mt=ans=0;
    125         e.clear();
    126         scanf("%d",&n);
    127         for(i=1;i<=n;i++){
    128             scanf("%d",&m);
    129             for(j=1;j<=m;j++){
    130                 ++k;
    131                 scanf("%d%d%d",&x,&y,&cou[k]);
    132                 val[k]=y-x;
    133                 ma[i][j]=k;
    134                 for(q=1;q<=cou[k];q++)
    135                     scanf("%d%d",&li[k][q][0],&li[k][q][1]);
    136             }
    137         }
    138         s=0,t=k+1;
    139         for(i=0;i<=t;i++)g[i].clear();
    140         for(i=1;i<=k;i++){
    141             if(val[i]>0)adde(s,i,val[i]);
    142             else if(val[i]<0)adde(i,t,-val[i]);
    143             for(j=1;j<=cou[i];j++)
    144                 adde(i,ma[li[i][j][0]][li[i][j][1]],LLNF);
    145         }
    146 
    147         isap();
    148         bfs();
    149         for(i=1;i<=k;i++)
    150             if(d[i]>0)ans+=val[i];
    151         printf("Case #%d: %I64d\n",++ca,ans);
    152     }
    153     return 0;
    154 }
  • 相关阅读:
    转:超级好用的流程图js框架
    流程图插件
    转:介绍几个著名的实用的Java反编译工具,提供下载
    关于 web.config impersonate 帐号模拟
    SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,总计(合计),小计
    【论文排版工具】——LaTeX的安装及使用(MiKTeX+TexStudio+Windows)
    C语言输入带空格的字符串
    SQL-连接查询:left join,right join,inner join,full join之间的区别
    MySQL与Oracle的隔离级别
    区块链节点运维相关
  • 原文地址:https://www.cnblogs.com/zhsl/p/2810698.html
Copyright © 2011-2022 走看看