HDU
来源:互联网 发布:php无限极分类 编辑:程序博客网 时间:2024/06/08 04:37
建图好难 。。。想了好半天TUT,最后看博客看会的,,
题意:n个任务,m台机器 每个任务有消耗时间p,开始时间s,结束时间e,问能不能完成所有的任务。
这个建图真的不好想。。
首先,因为我们要完成所有的任务,每个任务都有一个时间,所以就要判断完成这些任务的时间够不够,所以最大流跑的是时间。
建立源点,源点指向每一个任务,权值为这个任务耗费的时间,每一个任务又指向任务对应的每一个时间点权值为1,因为每台机器最多一次完成一个任务,每一个时间点指向汇点,权值为m,因为一个时间点可以有最多m台机器同时工作。
Sap跑的快一点? 就是太长。。记不住。。
AC代码:
#include<bits/stdc++.h>using namespace std;const int N=5005;const int M=520010;const int INF=0x3f3f3f3f;struct node{ int u,v,cap; int next;}eage[M];int head[N];int source,sink;int cur[N],dep[N],gap[N];int S[N];int top;int n,m;void Add(int u,int v,int w){ eage[top].u=u; eage[top].v=v; eage[top].cap=w; eage[top].next=head[u]; head[u]=top++; eage[top].u=v; eage[top].v=u; eage[top].cap=0; eage[top].next=head[v]; head[v]=top++;}void BFS(){ queue<int>q; memset(dep,-1,sizeof(dep)); memset(gap,0,sizeof(gap)); gap[0]=1; dep[sink]=0; q.push(sink); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=eage[i].next) { int v=eage[i].v; if(dep[v]==-1) { q.push(v); dep[v]=dep[u]+1; gap[dep[v]]++; } } }}int Sap(){ BFS(); memcpy(cur,head,sizeof(head)); int tot=0; int u=source; int ans=0; while(dep[source]<n) { if(u==sink) { int Min=INF; int inser; for(int i=0;i<=tot-1;i++) { if(Min>eage[S[i]].cap) { Min=eage[S[i]].cap; inser=i; } } for(int i=0;i<=tot-1;i++) { eage[S[i]].cap-=Min; eage[S[i]^1].cap+=Min; } ans+=Min; tot=inser; u=eage[S[tot]].u; } if(u!=sink&&gap[dep[u]-1]==0) break; int v; int i; for(i=cur[u];i!=-1;i=eage[i].next) { v=eage[i].v; if(eage[i].cap&&dep[v]+1==dep[u]) { break; } } if(i!=-1) { cur[u]=i; S[tot++]=i; u=v; continue; } int Min=n; for(int i=head[u];i!=-1;i=eage[i].next) { int v=eage[i].v; if(eage[i].cap&&dep[v]<Min) { Min=dep[v]; cur[u]=i; } } gap[dep[u]]--; dep[u]=Min+1; gap[dep[u]]++; if(u!=source)u=eage[S[--tot]].u; } return ans;}int main(){ int t; scanf("%d",&t); int count=0; while(t--) { memset(head,-1,sizeof(head)); top=0; count++; scanf("%d%d",&n,&m); //printf("%d%d\n",n,m); int Max=0; int sump=0; source=0; for(int i=1;i<=n;i++) { int p,s,e; scanf("%d%d%d",&p,&s,&e); if(Max<e)Max=e; sump+=p; Add(source,i,p); for(int j=s;j<=e;j++) { Add(i,n+j,1); } } sink=n+Max+1; for(int i=1;i<=Max;i++) { Add(n+i,sink,m);//每个时间点最多有m个机器同时工作 } n=n+Max+2; if(Sap()==sump)printf("Case %d: Yes\n\n",count); else printf("Case %d: No\n\n",count); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- Eclipse中的jsp文件中不能按住Ctrl点击变量定位到定义位置或者第一次引用位置
- hihocoder 1609 数组分拆II
- SlidingMenu的使用 左右滑出(挤出)布局
- ue4 如何修改打包android app的icon和欢迎界面
- php题目使用3中以上方法获取文件扩展名
- HDU
- 关于数据请求安全性问题
- 热水锅炉控制系统 分时段控制水温和水位
- 漫步最优化二十五——斐波那契搜索
- javascript 添加表单脚本 利用了bootstrap 框架美化
- Huawei MediaPad 10 FHD(101u) 精简版ROM
- 过拟合与欠拟合数学原理
- Spring MVC Interceptor
- Codeforces875 F-神奇图论