zoukankan      html  css  js  c++  java
  • 【LA2796】Concert Hall Scheduling(最大费用最大流)

    Description

    You are appointed director of a famous concert hall, to save it from bankruptcy. The hall is very
    popular, and receives many requests to use its two fine rooms, but unfortunately the previous director
    was not very efficient, and it has been losing money for many years. The two rooms are of the same
    size and arrangement. Therefore, each applicant wishing to hold a concert asks for a room without
    specifying which. Each room can be used for only one concert per day.
    In order to make more money, you have decided to abandon the previous fixed price policy, and rather
    let applicants specify the price they are ready to pay. Each application shall specify a period [i, j] and
    an asking price w, where i and j are respectively the first and last days of the period (1 ≤ i ≤ j ≤ 365),
    and w is a positive integer in yen, indicating the amount the applicant is willing to pay to use a room
    for the whole period.
    You have received applications for the next year, and you should now choose the applications you
    will accept. Each application should be either accepted for its whole period or completely rejected.
    Each concert should use the same room during the whole applied period.
    Considering the dire economic situation of the concert hall, artistic quality is to be ignored, and
    you should just try to maximize the total income for the whole year by accepting the most profitable
    applications.


    Input
    The input has multiple data sets, each starting with a line consisting of a single integer n, the number
    of applications in the data set. Then, it is followed by n lines, each of which represents one application
    with a period [i, j] and an asking price w yen in the following format.
    i j w
    A line containing a single zero indicates the end of the input.
    The maximum number of applications in a data set is one thousand, and the maximum asking price
    is one million yen.


    Output

    For each data set, print a single line containing an integer, the maximum total income in yen for the
    data set.


    Sample Input
    4
    1 2 10
    2 3 10
    3 3 10
    1 3 10
    6
    1 20 1000
    3 25 10000
    5 15 5000
    22 300 5500
    10 295 9000
    7 7 6000
    8
    32 251 2261
    123 281 1339
    211 235 5641
    162 217 7273
    22 139 7851
    194 198 9190
    119 274 878
    122 173 8640
    0


    Sample Output
    30
    25500
    38595

    【题意】

      你有2个房间,有365天,有n个人找你租房,第i个人要从第xi到第yi天要一个房(任意一个),付wi的钱,求怎样安排收的钱最多

    【分析】

      1~365天建一个点,st连1流量为2费用为0。

      根据输入的继续连边,比如第i个人要从第xi到第yi天要一个房(任意一个),付wi的钱那么建一条xi->yi+1流量为1,费用为wi的边。

      最后求最大费用最大流(去负跑最小费用最大流即可)。

    代码如下:

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cstring>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<queue>
      7 using namespace std;
      8 #define Maxm 1001000
      9 #define Maxn 400
     10 #define INF 0xfffffff
     11 
     12 int n;
     13 
     14 struct node
     15 {
     16     int x,y,f,c,o,next;
     17 }t[Maxm];int len;
     18 
     19 int first[Maxn],pre[Maxn],dis[Maxn],flow[Maxn];
     20 bool inq[Maxn];
     21 
     22 int mymin(int x,int y) {return x<y?x:y;}
     23 int mymax(int x,int y) {return x>y?x:y;}
     24 
     25 void ins(int x,int y,int f,int c)
     26 {
     27     t[++len].x=x;t[len].y=y;t[len].f=f;t[len].c=c;
     28     t[len].next=first[x];first[x]=len;t[len].o=len+1;
     29     t[++len].x=y;t[len].y=x;t[len].f=0;t[len].c=-c;
     30     t[len].next=first[y];first[y]=len;t[len].o=len-1;
     31 }
     32 
     33 queue<int > q;
     34 bool bfs(int st,int ed)
     35 {
     36     while(!q.empty()) q.pop();
     37     memset(dis,63,sizeof(dis));
     38     memset(inq,0,sizeof(inq));
     39     memset(pre,0,sizeof(pre));
     40     q.push(st);inq[st]=1;dis[st]=0;flow[st]=INF;
     41     while(!q.empty())
     42     {
     43         int x=q.front();
     44         for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
     45         {
     46             int y=t[i].y;
     47             
     48             if(dis[y]>dis[x]+t[i].c)
     49             {
     50                 dis[y]=dis[x]+t[i].c;
     51                 pre[y]=i;
     52                 flow[y]=mymin(flow[x],t[i].f);
     53                 if(!inq[y]) {q.push(y);inq[y]=1;}
     54             }
     55         }
     56         q.pop();inq[x]=0;
     57     }
     58     if(pre[ed]) return flow[ed];
     59     return 0;
     60 }
     61 
     62 void max_flow(int x,int y)
     63 {
     64     int sum=0,a;
     65     while(a=bfs(x,y))
     66     {
     67         int now=y;
     68         sum+=a*dis[y];
     69         while(now!=x)
     70         {
     71             t[pre[now]].f-=a;
     72             t[t[pre[now]].o].f+=a;
     73             now=t[pre[now]].x;
     74         }
     75     }
     76     printf("%d
    ",-sum);
     77 }
     78 
     79 int main()
     80 {
     81     while(1)
     82     {
     83         scanf("%d",&n);
     84         if(n==0) break;
     85         memset(first,0,sizeof(first));
     86         len=0;int mx=0;
     87         for(int i=1;i<=n;i++)
     88         {
     89             int x,y,c;
     90             scanf("%d%d%d",&x,&y,&c);
     91             ins(x,y+1,1,-c);
     92             mx=mymax(mx,y+1);
     93         }
     94         int st=367,ed=mx;
     95         ins(st,1,2,0);
     96         for(int i=1;i<mx;i++) ins(i,i+1,2,0);
     97         max_flow(st,ed);
     98     }
     99     return 0;
    100 }
    [LA3796]

    2016-05-25 13:27:56

  • 相关阅读:
    linux中anaconda环境下pytorch的安装(conda安装本地包)
    multi-label image classification:多标签图像分类总结
    TensorFlow,Keras限制GPU显存
    Linux常用文件操作命令
    卷积神经网络 CNN
    pycharm配置tensorflow环境 适用于Python3.6 CPU
    tensorflow模型ckpt转pb以及其遇到的问题
    使用delimiter //,解决mysql end报错问题
    C#死亡延迟队列DelayQueue
    如何发出人传人的裂变朋友圈?
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/5526677.html
Copyright © 2011-2022 走看看