HDU 3572 Task Schedule

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   io   for   

http://acm.hdu.edu.cn/showproblem.php?pid=3572

題意:給N個任務,M台機器。每個任務有最早才能開始做的時間S,deadline E,和持續工作的時間P。問存不存在可行的工作時間。

題解:最大流。主要問題在於建模……

   建模:源點與每一個任務建邊,容量為P;每一天與匯點建邊,容量為M;每一個任務和天數建邊,容量為1。

   判斷:判斷最後求得最大流是否和所有任務處理的次數之和相等,如果相等就輸出Yes。

第一次寫ISP,以後做模板用了……

  1 #include <iostream>  2 using namespace std;  3   4 const int INF=0xfffffff;  5 const int maxn=1010;  6 const int maxm=500010;  7   8 struct edge{  9     int v,next,val; 10 } G[maxm]; 11 int pre[maxn],idx, sum; 12 int N,M; 13 int level[maxn]; 14 int gap[maxn]; 15 int s,t; 16  17 void add_edge(int from,int to,int val) 18 { 19     G[idx].v=to; 20     G[idx].val=val; 21     G[idx].next=pre[from]; 22     pre[from]=idx++; 23      24     G[idx].v=from; 25     G[idx].val=0; 26     G[idx].next=pre[to]; 27     pre[to]=idx++; 28 } 29  30 int dfs(int pos,int cost, int cnt) 31 { 32     if (pos==t) 33     { 34         return cost; 35     } 36      37     int j,minh=cnt-1,lv=cost,d; 38      39     for (j=pre[pos];j!=-1;j=G[j].next) 40     { 41         int v=G[j].v,val=G[j].val; 42         if(val>0) 43         { 44             if (level[v]+1==level[pos]) 45             { 46                 if (lv<G[j].val) d=lv; 47                 else d=G[j].val; 48                  49                 d=dfs(v,d,cnt); 50                 G[j].val-=d; 51                 G[j^1].val+=d; 52                 lv-=d; 53                 if (level[s]>=cnt) return cost-lv; 54                 if (lv==0) break; 55             } 56              57             if (level[v]<minh)    minh=level[v]; 58         } 59     } 60      61     if (lv==cost) 62     { 63         --gap[level[pos]]; 64         if (gap[level[pos]]==0) level[s]=cnt; 65         level[pos]=minh+1; 66         ++gap[level[pos]]; 67     } 68      69     return cost-lv; 70      71 } 72  73 int sap(int s,int t, int cnt) 74 { 75     int flow=0; 76     gap[s]=cnt; 77     while (level[s]<cnt) 78     { 79         flow+=dfs(s,INF, cnt); 80     } 81      82     return flow; 83 } 84  85 void init() 86 { 87     memset(pre, -1, sizeof(pre)); 88     memset(gap,0,sizeof(gap)); 89     memset(level,0,sizeof(level)); 90     sum = idx = 0; 91 } 92  93 int main() 94 { 95     //freopen("/Users/apple/Desktop/暑假/24.1/24.1/in","r",stdin); 96     int T, ca = 1; 97     scanf("%d", &T); 98     while (T--) 99     {100         init();101         scanf("%d %d", &N, &M);102         int  P, S, E;103         int mint=INF;104         int maxt=-1;105         for (int i = 1; i <= N; ++i)106         {107             scanf("%d %d %d", &P, &S, &E);108             sum += P;109             if(mint>S) mint=S;110             if(maxt<E) maxt=E;111             add_edge(0, i, P);112             for (int j = S; j <= E; ++j)113             {114                 add_edge(i, N+j, 1);115             }116         }117         int days=maxt-mint+1;118         s=0;119         t=N+days+1;120         for (int i = 1; i <= days; ++i)121         {122             add_edge(i+N, N+days+1, M);123         }124 125         printf("Case %d: ",ca++);126         int flow1=sap(s,t,t+1);127         if(flow1==sum){128             puts("Yes");129             puts("");130         }131         else{132             puts("No");133             puts("");134         }135     }136     return 0;137 } 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.