FZU 1980 AbOr's story

AbOr's story

Time Limit: 1000ms
Memory Limit: 32768KB
This problem will be judged on FZU. Original ID: 1980
64-bit integer IO format: %I64d      Java class name: Main
 

As we all known, AbOr has a lots of girls in a palace called “Hou” (About 30 millions).

The girls in the palace love gemstones, such as cat’s eye, garnet, amethyst and so on. If AbOr wants to play with one girl, he must take all the gemstones the girl wants. But the girl would not take any gemstones away. Though the gemstone is expensive, but AbOr is a businessman and he has infinity money. If AbOr plays with one girl, he will feel happy and she will help AbOr to make some money. AbOr likes the new and loathes the old, so if he plays with one girl he used to play with, he will not feel happy any more, of course make no money. Initially AbOr has no gemstones.

The evil AbOr want to make as much money as possible. But he is very busy, so your task is to help him to calculate the maximum money he can make.

 

Input

In the first line there is an integer T (T≤10), indicating the number of cases. Each case begins with a line containing two integers N and M (1≤N, M≤10,000), the number of the girls in the palace and the number of the kinds of gemstones AbOr can get. The following N lines, each line contains an integer Li (0≤Li≤M, 1≤i≤N) first, the number of the kinds of gemstones the i-th girl wants. We guarantee that the sum of Li (1≤i≤N) is no more than 100,000. Then following Li integers Gj (1≤Gj≤M, 1≤j≤Li), the index of the gemstone the i-th girl wants. We guarantee that no replication index of the gemstone will appear in these Li integers. Then following an integer P (1≤P≤1,000,000,000), the money AbOr could make after playing with the i-th girl. The next line contains M integers Sk (1≤Sk≤1,000,000,000, 1≤k≤M), the price of the k-th gemstone is Sk. The index of the gemstone is labeled from 1 to M.
 

Output

For each test case, print a line containing the test case number (beginning with 1) and the maximum money AbOr can make.

 

Sample Input

3
1 2
2 1 2 100
3 7
1 2
1 1 100
1000 10000
2 1
1 1 100
1 1 16
17

Sample Output

Case 1: 90
Case 2: 0
Case 3: 99

Source

 
解题:最大权闭合图
 
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <climits>
  7 #include <vector>
  8 #include <queue>
  9 #include <cstdlib>
 10 #include <string>
 11 #include <set>
 12 #include <stack>
 13 #define LL long long
 14 #define pii pair<int,int>
 15 #define INF 0x3f3f3f3f
 16 using namespace std;
 17 const int maxn = 50010;
 18 struct arc{
 19     int to,next;
 20     LL flow;
 21     arc(int x = 0,LL y = 0,int z = -1){
 22         to = x;
 23         flow = y;
 24         next = z;
 25     }
 26 };
 27 arc e[600000];
 28 int head[maxn],d[maxn],cur[maxn];
 29 int tot,S,T,n,m;
 30 void add(int u,int v,LL flow){
 31     e[tot] = arc(v,flow,head[u]);
 32     head[u] = tot++;
 33     e[tot] = arc(u,0,head[v]);
 34     head[v] = tot++;
 35 }
 36 bool bfs(){
 37     memset(d,-1,sizeof(d));
 38     d[S] = 1;
 39     queue<int>q;
 40     q.push(S);
 41     while(!q.empty()){
 42         int u = q.front();
 43         q.pop();
 44         for(int i = head[u]; ~i; i = e[i].next){
 45             if(e[i].flow && d[e[i].to] == -1){
 46                 d[e[i].to] = d[u] + 1;
 47                 q.push(e[i].to);
 48             }
 49         }
 50     }
 51     return d[T] > -1;
 52 }
 53 LL dfs(int u,LL low){
 54     if(u == T) return low;
 55     LL tmp = 0,a;
 56     for(int &i = cur[u]; ~i; i = e[i].next){
 57         if(e[i].flow && d[e[i].to] == d[u] + 1 &&(a=dfs(e[i].to,min(e[i].flow,low)))){
 58             e[i].flow -= a;
 59             e[i^1].flow += a;
 60             tmp += a;
 61             low -= a;
 62             if(!low) break;
 63         }
 64     }
 65     if(!tmp) d[u] = -1;
 66     return tmp;
 67 }
 68 LL dinic(){
 69     LL ans = 0;
 70     while(bfs()){
 71         memcpy(cur,head,sizeof(head));
 72         ans += dfs(S,INF);
 73     }
 74     return ans;
 75 }
 76 int main() {
 77     int csn = 1,cs,ks,u,v,w;
 78     scanf("%d",&cs);
 79     while(cs--){
 80         scanf("%d %d",&n,&m);
 81         memset(head,-1,sizeof(head));
 82         S = tot = 0;
 83         T = n+m+1;
 84         LL ans = 0;
 85         for(int i = 1; i <= n; ++i){
 86             scanf("%d",&ks);
 87             while(ks--){
 88                 scanf("%d",&u);
 89                 add(i,u+n,INF);
 90             }
 91             scanf("%d",&w);
 92             add(S,i,w);
 93             ans += w;
 94         }
 95         for(int i = 1; i <= m; ++i){
 96             scanf("%d",&w);
 97             add(i+n,T,w);
 98         }
 99         printf("Case %d: %I64d
",csn++,ans - dinic());
100     }
101     return 0;
102 }
View Code
原文地址:https://www.cnblogs.com/crackpotisback/p/4054050.html