HDU 2883 kebab 网络流
2014-03-24 20:18
225 查看
有 n 个顾客,老板在单位时间只能考 m 个肉串。si 为顾客到的时间,ni 为顾客点的肉串数量,ti 为顾客要求每个肉串要烤多长时间,ei 为顾客必须要在这个时间之前拿到肉串。
由于时间的范围比大,我们可以将区间拆成最小的区间,每个区间看成一个点,每个区间想终点(T)连一条边 ,然后是每个顾客向合法的区间连一条容量大小为INF的边,起始点(S)向每个顾客连一条ni*si的边,最后求最大流,如果最大流等于E(ni*ti)那么就可以。否者就是NO。
ps:我开始把时间范围看错了,所以还用map搞了一下,其实没有必要的。时间是78ms.。
由于时间的范围比大,我们可以将区间拆成最小的区间,每个区间看成一个点,每个区间想终点(T)连一条边 ,然后是每个顾客向合法的区间连一条容量大小为INF的边,起始点(S)向每个顾客连一条ni*si的边,最后求最大流,如果最大流等于E(ni*ti)那么就可以。否者就是NO。
ps:我开始把时间范围看错了,所以还用map搞了一下,其实没有必要的。时间是78ms.。
#include <iostream> #include <stdlib.h> #include <cstdio> #include <algorithm> #include <memory.h> #include <vector> #include <queue> #include <map> #define INF 1<<29 #define maxn 2050 #define maxm 2050 using namespace std; struct Edge{ int from,to,cap,flow; }; struct mystruct { int ni,ti,si,ei; }Interval[maxm],e; vector<int>G[maxm]; vector<Edge>edges; int cur[maxn],d[maxn],vis[maxn],tot; int temp[maxm],value[maxm],num,cnt,s,t; int m,n,si,ei,ni,ti; void init(int n) { edges.clear(); for(int i=0;i<=n;i++)G[i].clear(); } void AddEdge(int from , int to , int cap) { edges.push_back((Edge){from,to,cap,0}); edges.push_back((Edge){to,from,0,0}); int m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS() { memset(vis,0,sizeof vis); memset(d,0,sizeof d); queue<int>Q; Q.push(s); d[s]=0; vis[s]=1; while(!Q.empty()) { int x = Q.front();Q.pop(); int len = G[x].size(); for(int i=0;i<len;i++) { Edge &e = edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow) { vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } int DFS(int x ,int a) { if(x==t||a==0)return a; int flow = 0,f; int len = G[x].size(); for(int &i = cur[x];i<len ;i++) { Edge &e = edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0) { e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0)break; } } return flow; } int Maxflow(int s , int t) { int flow=0; while(BFS()){ memset(cur,0,sizeof cur); flow+=DFS(s,INF); } return flow; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { tot=num=0;cnt=1; map<int,int>Mymap; for(int i = 1;i <= n;i++ ) { scanf("%d%d%d%d",&si,&ni,&ei,&ti); Interval[i]=(mystruct){ni,ti,si,ei}; temp[++num]=si; temp[++num]=ei; tot+=ni*ti; } sort(temp+1,temp+num+1); value[1]=temp[1]; Mymap[value[1]]=cnt; for(int i = 2;i<=num ;i++){ if(value[cnt]!=temp[i]) { value[++cnt]=temp[i]; Mymap[value[cnt]]=cnt; } } num=n+cnt; s=0;t=cnt+n+1; for(int i=1;i<cnt;i++){ AddEdge(i,t,(value[i+1]-value[i])*m); } for(int i=1;i<=n;i++) { e = Interval[i]; int tmp=e.si; int pos = Mymap[e.si]; AddEdge(0,cnt+i,e.ni*e.ti); while(value[pos]<e.ei){ AddEdge(cnt+i,pos,INF); pos++; } } printf("%s\n",Maxflow(s,t)==tot?"Yes":"No"); init(cnt+n+n+1); } return 0; }
相关文章推荐
- 【网络流】 hdu 2883 kebab
- kebab (hdu 2883 网络流判满流 关键是缩点)
- HDU 2883kebab(网络流之最大流)
- hdu 2883 kebab 网络流
- 【网络流】 HDU 2883 kebab 离散
- 【网络流】 HDU 2883 kebab 离散
- hdu 2883 kebab
- hdu 2883 kebab(存个最大流模板)
- [HDU 2883]kebab[最大流][区间离散化]
- hdu 3572 Task Schedule hdu 2883 kebab 最大流
- HDU 2883 kebab 最大流(纯靠建图)
- hdu 2883 kebab
- hdu 3572 Task Schedule hdu 2883 kebab 最大流
- hdu 2883 kebab 【网络最大流】
- HDU kebab(网络流,最大流)
- HDU 2883 kebab【最大流】(判断是否满流)
- hdu 2883 kebab
- hdu 2883 kebab (最大流 + 建图)
- hdu 2883 kebab(最大流dinic邻接表)
- hdu 2883 kebab【最大流Dinic+缩点】