网络流HDU 2883

建图           源点  ->     每个人  ->           每段时间      ->      汇点 

时间要离散化一下 分成一些时间段

权                     inf    ti[i]*(time[i]-time[i-1])  m*(time[i]-time[i-1])

n人 m个机器

开始时间  总共要的数目 底线时间  每个所需时间 

如果可以达到输出Y 否则N

  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<string.h>
  4 #include<queue>
  5 #include<math.h>
  6 
  7 using namespace std;
  8 #define inf   100000000
  9 #define MAXN 300
 10 #define MAXN1 200000
 11 int si[MAXN+10],ni[MAXN+10],ei[MAXN+10],ti[MAXN+10];
 12 int time[MAXN*2+10],S,T;
 13 int head[5*MAXN];
 14 int cnt;
 15 
 16 struct edg
 17 {
 18     int w,next,to;
 19 
 20 }x[MAXN1+10];
 21 
 22 void add(int u,int v,int w)
 23 {
 24     x[cnt].next=head[u];
 25     x[cnt].to=v;
 26     x[cnt].w=w;
 27     head[u]=cnt++;
 28 }
 29 int vis[5*MAXN];
 30 
 31 int bfs()
 32 {
 33     memset(vis,-1,sizeof(vis));
 34     vis[S]=0;
 35     queue<int>q1;
 36     q1.push(S);
 37 
 38     while(!q1.empty())
 39     {
 40         int now=q1.front();
 41         q1.pop();
 42         for(int j=head[now];j!=-1;j=x[j].next)
 43         {
 44             if(vis[x[j].to]<0&&x[j].w)
 45             {
 46                 vis[x[j].to]=vis[now]+1;
 47                 q1.push(x[j].to);
 48             }
 49         }
 50     }
 51     return vis[T]!=-1;
 52 }
 53 int dfs(int u,int w)
 54 {
 55     int ans=0;
 56 
 57     if(u==T)
 58         return w;
 59     int i;
 60 
 61     for(i=head[u];i!=-1;i=x[i].next)
 62     {
 63         if(vis[x[i].to]==vis[u]+1&&x[i].w)
 64         {
 65             int b=dfs(x[i].to,min(w-ans,x[i].w));
 66             x[i].w-=b;
 67             x[i^1].w+=b;
 68             ans=ans+b;
 69         }
 70     }
 71     return ans;
 72 }
 73 int main()
 74 {
 75     int n,m;
 76 
 77     while(scanf("%d%d",&n,&m)!=EOF)
 78     {
 79         int i,j;
 80         int c1,sum=0;
 81         cnt=0;
 82 
 83         for(i=1;i<=n;i++)
 84         {
 85             scanf("%d%d%d%d",&si[i],&ni[i],&ei[i],&ti[i]);
 86             time[cnt++]=si[i];
 87             time[cnt++]=ei[i];
 88             sum=sum+ni[i]*ti[i];
 89         }
 90         sort(time,time+cnt);
 91         c1=1;
 92         for(i=1;i<cnt;i++)
 93         {
 94             if(time[i]!=time[i-1])
 95                 time[c1++]=time[i];
 96         }
 97         S=0;
 98         T=n+c1+1;
 99         cnt=0;
100 
101         memset(head,-1,sizeof(head));
102         for(i=1;i<=n;i++)
103             add(S,i,ni[i]*ti[i]),add(i,S,0);
104 
105         for(i=0;i<c1;i++)
106         {
107             if(i==0) //0的时候没有i-1
108             {
109                 add(n+i+1,T,m*time[i]);
110                 add(T,n+i+1,0);
111             }
112             else
113             {
114                 add(n+i+1,T,m*(time[i]-time[i-1]));
115                 add(T,n+i+1,0);
116             }
117 
118             for(j=1;j<=n;j++)
119             {
120                 int a;
121 
122                 if(i==0)
123                     a=0;
124                 else
125                     a=time[i-1];
126                 if(si[j]<=a&&time[i]<=ei[j])
127                 {
128                     add(j,n+i+1,inf);
129                     add(n+i+1,j,0);
130                 }
131             }
132         }
133         int ans=0;
134         while(bfs())
135             ans=ans+dfs(S,inf);
136 
137         if(ans>=sum)
138             printf("Yes\n");
139         else
140             printf("No\n");
141     }
142 
143     return 0;
144 }

 

posted on 2016-11-09 09:10  HelloWorld!--By-MJY  阅读(182)  评论(0编辑  收藏  举报

导航