zoukankan      html  css  js  c++  java
  • 【最大流】XMU 1595 机器调度

    题目链接:

      http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1595

    题目大意

      T组数据,n个任务,m个机器,对于每个任务:有一个处理时间p(表示这个任务需要机器工作p天才能完成),一个释放时间r(表示该任务需要从第r天开始才能被处理),一个完成时间d(表示在第d天之前该任务必须完成)保证:d >= p + r。一个任务同一时间只能在一个机器上运行,但是运行时可以被中断,并移到另一个机器上运行。对于每台机器:在同一时间最多只能处理一个任务,在不同的时间可以处理不同的任务。问是否存在一个调度方案,使得所有任务均可以顺利完成?

    题目思路:

      【最大流】

      没看出来是网络流问题。

      将任务和该任务能运行的时间连边,S到任务连处理时间,时间到T连可运行机器数。

      N个任务看成N个节点,对于每个时间夜也抽象成节点,然后设源和汇

      源到任务节点连边,容量为该任务的时间,任务到每个可操作的时间节点连边,容量就是1,最后每个时间节点到汇点连边,容量为机器数量

      最后求解最大流,若最大流=所有任务的总时间,则有解。

     
      1 //
      2 //by coolxxx
      3 //
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<memory.h>
      9 #include<time.h>
     10 #include<stdio.h>
     11 #include<stdlib.h>
     12 #include<string.h>
     13 #include<stdbool.h>
     14 #include<math.h>
     15 #define min(a,b) ((a)<(b)?(a):(b))
     16 #define max(a,b) ((a)>(b)?(a):(b))
     17 #define abs(a) ((a)>0?(a):(-(a)))
     18 #define lowbit(a) (a&(-a))
     19 #define sqr(a) ((a)*(a))
     20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     21 #define eps 1e-8
     22 #define J 10
     23 #define MAX 0x7f7f7f7f
     24 #define PI 3.1415926535897
     25 #define inf 10000000
     26 #define N 504
     27 #define M 50004
     28 using namespace std;
     29 int n,m,lll,ans,cas;
     30 int nn,fl,s,t;
     31 int last[N],d[N],vd[N];
     32 struct xxx
     33 {
     34     int next,e,q;
     35 }a[M];
     36 void add(int x,int y,int z)
     37 {
     38     a[++lll].next=last[x];
     39     a[lll].e=y;
     40     a[lll].q=z;
     41     last[x]=lll;
     42 }
     43 int sap(int u,int f)
     44 {
     45     int i,v,tt,asp=0,mix=nn-1;
     46     if(u==t)return f;
     47     for(i=last[u];i!=0;i=a[i].next)
     48     {
     49         v=a[i].e;
     50         if(a[i].q>0)
     51         {
     52             if(d[u]==d[v]+1)
     53             {
     54                 tt=sap(v,min(f-asp,a[i].q));
     55                 asp+=tt;
     56                 a[i].q-=tt;
     57                 a[i^1].q+=tt;
     58                 if(asp==f || d[s]==nn)
     59                     return asp;
     60             }
     61             mix=min(mix,d[v]);
     62         }
     63     }
     64     if(asp!=0)return asp;
     65     if(!--vd[d[u]])d[s]=nn;
     66     else vd[d[u]=mix+1]++;
     67     return asp;
     68 }
     69 void build()
     70 {
     71     int i,j,x,y,z;
     72     s=100+200+1;t=100+200+2;
     73     nn=0;
     74     for(i=1;i<=n;i++)
     75     {
     76         scanf("%d%d%d",&x,&y,&z);
     77         fl+=x;nn=max(nn,z);
     78         add(s,i,x);add(i,s,0);
     79         for(j=y;j<z;j++)
     80         {
     81             add(i,n+j,1);add(n+j,i,0);
     82         }
     83     }
     84     for(i=1;i<=nn;i++)
     85     {
     86         add(n+i,t,m);add(t,n+i,0);
     87     }
     88     nn+=n+2;
     89     vd[0]=nn;
     90 }
     91 int main()
     92 {
     93     #ifndef ONLINE_JUDGE
     94 //    freopen("1.txt","r",stdin);
     95 //    freopen("2.txt","w",stdout);
     96     #endif
     97     int i,j,k,l,f;
     98 //    while(~scanf("%s",s1))
     99 //    while(~scanf("%d",&n))
    100     for(scanf("%d",&cas),l=1;l<=cas;l++)
    101     {
    102         fl=ans=0;lll=1;
    103         memset(d,0,sizeof(d));
    104         memset(vd,0,sizeof(vd));
    105         memset(last,0,sizeof(last));
    106         scanf("%d%d",&n,&m);
    107         build();
    108         while(d[s]<nn)
    109         {
    110             f=sap(s,MAX);
    111             ans+=f;
    112         }
    113         if(ans==fl)puts("Yes");
    114         else puts("No");
    115     }
    116     return 0;
    117 }
    118 
    119 /*
    120 //
    121 
    122 //
    123 */
    View Code
  • 相关阅读:
    python3 简单爬虫
    springmvc的一个错误
    全栈技术经理——产品管理:产品管理那些事01
    全栈技术经理——团队管理:每周问问你的团队这这些问题 V1.0
    全栈技术经理——自我管理:读《有效管理的五大兵法》有感
    全栈技术经理——团队管理:指导中层管理者日常行动指南
    【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
    CentOS7环境下SSH端口修改笔记
    CentOS7下挂载硬盘笔记
    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5469875.html
Copyright © 2011-2022 走看看