• 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
  • 相关阅读:
    C语言 百炼成钢1
    C语言 位运算
    GPS nmealib学习 问题
    c语言 GPS nmealib学习笔记
    ubuntu 12.04 以固定 IP 地址连接网络并配置DNS
    WGS84 2 GCJ-02
    【转】地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法 C#
    【转】地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法 C语言
    nmealib-0.5.3 问题 Build Error: undefined reference to `ceil'
    ArcGIS for WPF 访问外部资源
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4054050.html
Copyright © 2020-2023  润新知