zoukankan      html  css  js  c++  java
  • hlg1061Boss Xnby’s Scheduling Problem【建模比较难想】

    Boss Xnby’s Scheduling Problem
    Time Limit: 2000 MS Memory Limit: 65536 K
    Total Submit: 39(8 users) Total Accepted: 9(7 users) Rating:  Special Judge: No
    Description

    Boss xnby owns a company, as you know, in the company there are lots of jobs to do.Each job J has a processing requirement p(denoting the number of machine days required to complete the job), a release date rj (representing the beginning of the day when job j becomes avalible for processing), and a due date dj ≥ rj  + pj (representing the beginning of the day by which the job must be completed). What could we do when facing so many jobs? Thank goodness, in xnby’s company, there are some parallel machines can do these jobs.Since a machine can work on only one job at a time and each job can be processed by at most one machine at a time.And preemptions(i.e., we can interrupt a job and process it on different machines on different days) is allowed.Now xnby can use these parallel machines to process these boring jobs,but he also need to determine a feasible schedule that completes all jobs before their due dates or show no such schedule existd.Xnby is a boss, he is a big shot, he had no time to do with these trivial things, so he arranged for you to do this task.

    Input

    An integer T (T ≤ 100) indicated the number of test cases. 

    For each test cases:

    Two integers J and M (J ≤ 100, M ≤ 100) denote jobs and machines respectively.

    In the following J lines(each job one line, in ascending order), each line contains three integers p, r, d (p ≤ 100,r ≤ 100 and d ≤ 200) denote processing requirement, release date and due date respectively.

    Output

    For each test case, output “Boss xnby is angry!” if no such schedule exists.Otherwise output “Boss xnby is happy!”.

    Sample Input
    1
    4 3
    2 3 5
    1 1 4
    2 3 7
    4 5 9
    Sample Output

    Boss xnby is happy!

    Hint

    One schedule: Job 1 must be done in day 3 and day 4, and job 2 can be done in day 1,job 3 can be done in day 5 or day 6,the last job’s first two days can be done in day 5 and day 6(since there 3 machines, so it will not conflict with job 3), the remaining 2 days can be done in day 7 and day 8.

    Author
    monster@monster

    题意:

    有n项任务m台机器

    每项任务可能需要多天来完成

    每个机器每天只能处理一个任务 并且每个任务 每天只能每一台机器处理

    有n项任务 告诉你每项任务的开始时间,截止时间和完成它所需要的时间

    问这些任务能否在规定时间内全部完成?

    分析:

    这个题是我做的第一个网络流的题

    读完题之后我就开始准备建模,

    想任务跟机器之间的关系

    想了好长时间也没想明白怎么建

    后来看周洲的分析恍然大悟

    原来我少分析了一个因素:日期

    其实只要把任务跟日期之间建图,机器的作用呢,这样来想,每天最多能承受的任务数不就是机器的数量吗?

    这样图就建好了

    代码:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #include <vector>
      6 using namespace std;
      7 
      8 const int maxn = 305 << 1;
      9 const int INF = 1000000000;
     10 
     11 struct Edge
     12 {
     13     int from, to, cap, flow;
     14 };
     15 
     16 struct Dinic
     17 {
     18     int n, m, s, t;
     19     vector<Edge> edges;
     20     vector<int>G[maxn];
     21     bool vis[maxn];
     22     int d[maxn];
     23     int cur[maxn];
     24 
     25     void ClearAll(int n) {
     26         for(int i = 0; i <= n; i++) {
     27             G[i].clear();
     28         }
     29         edges.clear();
     30     }
     31 
     32     void AddEdge(int from, int to, int cap) {
     33         edges.push_back((Edge){from, to, cap, 0} );
     34         edges.push_back((Edge){to, from, 0, 0} );
     35         m = edges.size();
     36         G[from].push_back(m - 2);
     37         G[to].push_back(m - 1);
     38         //printf("%din end
    ",m);
     39     }
     40 
     41     bool BFS()
     42     {
     43         memset(vis, 0, sizeof(vis) );
     44         queue<int> Q;
     45         Q.push(s);
     46         vis[s] = 1;
     47         d[s] = 0;
     48         while(!Q.empty() ){
     49             int x = Q.front(); Q.pop();
     50             for(int i = 0; i < G[x].size(); i++) {
     51                 Edge& e = edges[G[x][i]];
     52                 if(!vis[e.to] && e.cap > e.flow) {
     53                     vis[e.to] = 1;
     54                     d[e.to] = d[x] + 1;
     55                     Q.push(e.to);
     56                 }
     57             }
     58         }
     59         return vis[t];
     60     }
     61 
     62     int DFS(int x, int a) {
     63         if(x == t || a == 0) return a;
     64         int flow = 0, f;
     65         for(int& i = cur[x]; i < G[x].size(); i++) {
     66             Edge& e = edges[G[x][i]];
     67             if(d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow))) > 0) {
     68                 e.flow += f;
     69                 edges[G[x][i]^1].flow -= f;//这儿wrong了一次
     70                 flow += f;
     71                 a -= f;
     72                 if(a == 0) break;
     73             }
     74         }
     75         return flow;
     76     }
     77 
     78     int Maxflow(int s, int t) {
     79         this -> s = s; this -> t = t;
     80         int flow = 0;
     81         while(BFS()) {
     82             memset(cur, 0, sizeof(cur) );
     83             flow += DFS(s, INF);
     84         }
     85         return flow;
     86     }
     87 };
     88 
     89 Dinic g;
     90 
     91 int main()
     92 {
     93     int t;
     94     //freopen("a.txt","r",stdin);
     95     scanf("%d",&t);
     96     int J, M;
     97     int p, r, d;
     98     while(t--)
     99     {
    100         scanf("%d %d",&J, &M);
    101         int sum = 0;
    102         g.ClearAll(405);
    103         int min_date = INF, max_date = -INF;
    104         for(int i = 1; i <= J; i++)
    105         {
    106             scanf("%d %d %d",&p, &r, &d);
    107             if(min_date > r)
    108             min_date = r;
    109             if(max_date < d)
    110             max_date = d;
    111             sum += p;
    112             g.AddEdge(0, i, p);
    113             for(int j = r; j < d; j++)
    114                 g.AddEdge(i, j + J, 1);
    115         }
    116         for(int j = min_date; j <= max_date; j++)
    117         {
    118             g.AddEdge(j + J, 401, M);
    119         }
    120         int ans = g.Maxflow(0, 401);
    121        // printf("sum:%d ans:%d
    ",sum, ans);
    122         if(ans == sum)
    123         puts("Boss xnby is happy!");
    124         else
    125         puts("Boss xnby is angry!");
    126     }
    127     return 0;
    128 }
    View Code
  • 相关阅读:
    大型网站架构系列:20本技术书籍推荐
    程序员进阶顺序
    乐观锁与悲观锁——解决并发问题
    Redis的事务功能详解
    驱动开发(8)处理设备I/O控制函数DeviceIoControl
    钱币兑换问题(杭电1284)(母函数)
    jqm文件上传,上传图片,jqm的表单操作,jqm的ajax的使用,jqm文件操作大全,文件操作demo
    问:简述一下内部类的实质是什么?
    Android 删除新版安卓fragment_main.xml
    保温饭盒毕业设计程序
  • 原文地址:https://www.cnblogs.com/zhanzhao/p/3748795.html
Copyright © 2011-2022 走看看