网络流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) 编辑 收藏 举报