hdu3572 Task Schedule (最大流)
来源:互联网 发布:晨风qq机器人php源码 编辑:程序博客网 时间:2024/04/30 02:50
题意:有n个task,要交给m个机器完成。task[i]需要p[i]天完成,必须在第t[i]天或第t[i]天之后开始,在e[i]天或e[i]天之前结束。每个task每天只能被一个机器处理,每个机器每天只能处理一个任务,问是否能按要求完成所有的task。
解题思路:最大流。每个task建一个点,然后每天建一个点,源点向task建边,容量为p[i],表示每个task最多被处理p[i]次。task向[ s[i] , e[i] ]区间内的天建边,每条边容量为1,表示每个任务每天只能被处理一次。每天向汇点建边,容量为m。表示每天最多可以有m个任务被分配出来给m个机器处理,至于这一天是哪台机器处理了哪个task,我们不关心。然后跑最大流,总流量等于p[i]之和则可行。
代码:
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>using namespace std ;const int INF = 1111111111 ;struct Task { int s , p , t ;} task[555] ;struct Edge { int from , to , cap , next ;} edge[800000] ;int head[1220] , tot ;void new_edge ( int from , int to , int cap ) { edge[tot].from = from ; edge[tot].to = to ; edge[tot].cap = cap ; edge[tot].next = head[from] ; head[from] = tot ++ ;}struct Max_Flow { int dis[1220] , s , t , cur[1220] ; queue<int> Q ; bool bfs ( int n ) { int i , u , v ; for ( i = 1 ; i <= n ; i ++ ) dis[i] = INF ; dis[s] = 0 ; Q.push ( s ) ; while ( !Q.empty () ) { u = Q.front () ; Q.pop () ; for ( i = head[u] ; i != -1 ; i = edge[i].next ) { v = edge[i].to ; if ( dis[v] == INF && edge[i].cap ) { dis[v] = dis[u] + 1 ; Q.push ( v ) ; } } } return dis[t] != INF ; } int dfs ( int u , int a ) { if ( u == t || !a ) return a ; int f , flow = 0 ; for ( int& i = cur[u] ; i != -1 ; i = edge[i].next ) { int v = edge[i].to ; if ( dis[v] == dis[u] + 1 && ( f = dfs ( v , min ( a , edge[i].cap ) ) ) ) { flow += f ; edge[i].cap -= f ; edge[i^1].cap += f ; a -= f ; if ( a == 0 ) break ; } } return flow ; } int dinic ( int s , int t , int n ) { this->s = s ; this->t = t ; int flow = 0 ; while ( bfs ( n ) ) { for ( int i = 1 ; i <= n ; i ++ ) cur[i] = head[i] ; flow += dfs ( s , INF ) ; } return flow ; }} ac ;int main () { int n , m , mx , i , j ; int t , ca = 0 , cnt ; scanf ( "%d" , &t ) ; while ( t -- ) { scanf ( "%d%d" , &n , &m ) ; mx = tot = cnt = 0 ; memset ( head , -1 , sizeof ( head ) ) ; for ( i = 1 ; i <= n ; i ++ ) { scanf ( "%d%d%d" , &task[i].p , &task[i].s , &task[i].t ) ; cnt += task[i].p ; mx = max ( mx , task[i].t ) ; } int s = n + mx + 1 , t = n + mx + 2 ; for ( i = 1 ; i <= n ; i ++ ) { new_edge ( s , i , task[i].p ) ; new_edge ( i , s , 0 ) ; for ( j = task[i].s ; j <= task[i].t ; j ++ ) { new_edge ( i , n + j , 1 ) ; new_edge ( n + j , i , 0 ) ; } } for ( i = 1 ; i <= mx ; i ++ ) { new_edge ( n + i , t , m ) ; new_edge ( t , n + i , 0 ) ; } printf ( "Case %d: " , ++ ca ) ; if ( ac.dinic ( s , t , n + mx + 2 ) != cnt ) puts ( "No" ) ; else puts ( "Yes" ) ; puts ( "" ) ; } return 0 ;}
0 0
- hdu3572 Task Schedule (最大流)
- HDU3572 Task Schedule 【最大流】
- 【最大流】【HDU3572】Task Schedule
- HDU3572 Task Schedule(最大流)
- hdu3572 Task Schedule【最大流】
- HDU3572 Task Schedule 网络流最大流
- HDU3572:Task Schedule(最大流)
- hdu3572 Task Schedule(最大流dinic)
- HDU3572——Task Schedule (最大流判断满流)
- hdu3572--Task Schedule(最大流+两种优化方法,dinic)
- hdu3572 Task Schedule (最大流+构图思维)
- Task Schedule(Hdu3572网络流)
- hdu3572 Task Schedule 网络流(Dinic)
- HDU3572 Task Schedule
- hdu3572 Task Schedule(基础) [最大流]任务分配,判断满流
- hdu3572-Task Schedule(最大流(ISAP),是否满流)
- hdu3572 Task Schedule--Dinic算法 & 最大流 & 链式前向星 & vector
- hdu3572 Task Schedule (ISAP算法)
- Longest Common Prefix
- TOJ 2600 Safe Travel -- 左偏树
- 花生壳配置动态域名使用经验
- BaseAdapter 解决卡的问题
- session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (
- hdu3572 Task Schedule (最大流)
- eclipse用git恢复到某个commit
- Ubuntu英语环境下完全显示文泉驿微米黑字体的字体配置文件
- 感谢您注册CSDN社区,您只需要点击下面链接,激活您的帐户,您便可以享受CSDN各项服务。
- PHP安全过滤用户输入
- ThinkPad win7 鼠标自动点击错误
- 排列组合java源代码及jar包
- 工作内容
- UvaOJ 401——解题报告