HDU 3572 Task Schedule

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 } 

 

posted @ 2014-07-30 19:38  Der_Z  阅读(187)  评论(0编辑  收藏  举报