码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4971

时间:2014-08-25 09:56:04      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   div   代码   log   

此题居然是一道搜索。。。。。

不过还是可以用网络流做的

贴个代码,看我说明还不如看大神的论文。。。。。具体做法类似NOI的最大获利,具体请看论文《最小割模型在信息学竞赛中的应用》

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cstring>
  6 
  7 using namespace std;
  8 
  9 const int N = 128;
 10 const int M = 1e5 + 7;
 11 const int INF = 0x3f3f3f3f;
 12 
 13 struct Edge{
 14     int v, ne, c, f;
 15 };
 16 
 17 struct Net_Dinic{
 18     Edge e[M];
 19     int q[N], stack[N], head[N], cur[N], dis[N];
 20     bool used[N];
 21     
 22     int pos, top, stop, flow, S, T;
 23     
 24     bool adde(int u, int v, int c){
 25         //printf("%d -> %d %d\n", u, v, c);
 26         e[++pos] = (Edge){v, head[u], c, 0};
 27         head[u] = pos;
 28         e[++pos] = (Edge){u, head[v], c, c};
 29         head[v] = pos;
 30     }
 31     
 32     void init(int s, int t){
 33         S = s;
 34         T = t;
 35         memset(head, 0, sizeof(head));
 36         flow = top = 0;
 37         pos = 1;
 38     }
 39     
 40     bool number(){
 41         //printf("Number\n");
 42         memset(dis, 0x3f, sizeof(dis));
 43         memset(used, 0, sizeof(used));
 44         int p1, p2;
 45         q[p1 = p2 = 1] = S;
 46         used[S] = true;
 47         dis[S] = 0;
 48         while (p1 <= p2){
 49             int u = q[p1++];
 50             for (int i = head[u]; i; i = e[i].ne){
 51                 int v = e[i].v;
 52                 if (!used[v] && e[i].c > e[i].f){
 53                     q[++p2] = v;
 54                     dis[v] = dis[u] + 1;
 55                     used[v] = true;
 56                 }
 57             }
 58         }
 59         memcpy(cur, head, sizeof(head));
 60         return dis[T] != INF;
 61     }
 62     
 63     bool find(int u){
 64         if (u == T){
 65             int cut = INF;
 66             for (int i = 1; i <= top; ++i)
 67                 cut = min(cut, e[stack[i]].c - e[stack[i]].f);
 68             for (int i = top; i; --i){
 69                 e[stack[i]].f += cut;
 70                 e[stack[i] ^ 1].f -= cut;
 71                 if (e[stack[i]].c == e[stack[i]].f)
 72                     stop = i;
 73             }
 74             flow += cut;
 75             return true;
 76         }
 77         for (int &i = cur[u]; i; i = e[i].ne){
 78             int v = e[i].v;
 79             if (e[i].c > e[i].f && dis[v] == dis[u] + 1){
 80                 stack[++top] = i;
 81                 if (find(v) && stop != top){
 82                     --top;
 83                     return true;
 84                 }
 85                 --top;
 86             }
 87         }
 88         return false;
 89     }
 90     
 91     int maxflow(){
 92         while (number())
 93             find(S);
 94         return flow;
 95     }
 96 }net;
 97 
 98 int main(){
 99     int T, n, m, s, t, x, y, sum;
100     scanf("%d", &T);
101     for (int Test = 1; Test <= T; ++Test){
102         scanf("%d%d", &n, &m);
103         s = n + m + 1;
104         t = s + 1;
105         net.init(s, t);
106         
107         sum = 0;
108         for (int i = 1; i <= n; ++i){
109             scanf("%d", &x);
110             net.adde(s, i, x);
111             sum += x;
112         }
113         
114         for (int i = 1; i <= m; ++i){
115             scanf("%d", &x);
116             net.adde(i + n, t, x);
117         }
118         
119         for (int i = 1; i <= n; ++i){
120             scanf("%d", &y);
121             while (y--){
122                 scanf("%d", &x);
123                 net.adde(i, x + n + 1, INF);
124             }
125         }
126         
127         for (int i = 1; i <= m; ++i)
128             for (int j = 1; j <= m; ++j){
129                 scanf("%d", &x);
130                 if (x == 1)
131                     net.adde(i + n, j + n, INF);
132             }
133         int ans = net.maxflow();
134         printf("Case #%d: %d\n", Test, sum - ans);
135     }
136     return 0;
137 }

 

HDU 4971

标签:style   blog   color   os   io   for   div   代码   log   

原文地址:http://www.cnblogs.com/addf/p/3934241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!