hdu 2883 kebab(存个最大流模板)
来源:互联网 发布:国家电网考试软件 编辑:程序博客网 时间:2024/06/03 20:45
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define ll __int64using namespace std ;const int N = 11111 ;const int M = 2222222 ;const ll INF = (ll) 11111111 * 11111111 ;struct Task { int l , r , t , id ;} task[N] ;struct Edge { int to , next ; ll cap ;} edge[M] ;int head[N] , tot , x[N] ;void new_edge ( int from , int to , ll cap ) { // printf ( "from = %d , to = %d , cap = %I64d\n" , from , to , cap ) ; edge[tot].to = to ; edge[tot].cap = cap ; edge[tot].next = head[from] ; head[from] = tot ++ ; edge[tot].to = from ; edge[tot].cap = 0 ; edge[tot].next = head[to] ; head[to] = tot ++ ;} ;struct Max_Flow { queue<int> Q ; ll dis[N] ; int cur[N] ; int s , t ; bool bfs ( int n ) { int u , v , i ; for ( i = 1 ; i <= n ; i ++ ) dis[i] = INF ; Q.push ( s ) ; dis[s] = 0 ; while ( !Q.empty () ) { u = Q.front () , Q.pop () ; for ( i = head[u] ; i != -1 ; i = edge[i].next ) { v = edge[i].to ; if ( edge[i].cap && dis[v] == INF ) { dis[v] = dis[u] + 1 ; Q.push ( v ) ; } } } return dis[t] != INF ; } ll dfs ( int u , ll a ) { if ( u == t || a == 0 ) return a ; ll flow = 0 , f ; 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))) ) { edge[i].cap -= f ; edge[i^1].cap += f ; flow += f ; a -= f ; if ( a == 0 ) break ; } } return flow ; } ll dinic ( int s , int t , int n ) { this->s = s ; this->t = t ; ll ret = 0 ; while ( bfs ( n ) ){ for ( int i = 1 ; i <= n ; i ++ ) cur[i] = head[i] ; ret += dfs ( s , INF ) ; } // printf ( "ret = %d\n" , ret ) ; return ret ; }} AC ;int cnt ;void init () { cnt = tot = 0 ; memset ( head , -1 , sizeof ( head ) ) ;}int main () { int n , m ; while ( scanf ( "%d%d" , &n , &m ) != EOF ) { init () ; int s = ++ cnt , t = ++ cnt ; int T = 0 ; ll need = 0 ; for ( int i = 1 ; i <= n ; i ++ ) { int a , b , c , d ; scanf ( "%d%d%d%d" , &a , &b , &c , &d ) ; a ++ ; x[++T] = a , x[++T] = c ; task[i].l = a , task[i].r = c ; task[i].t = b * d ; task[i].id = ++ cnt ; new_edge ( s , cnt , task[i].t ) ; need += task[i].t ; } sort ( x + 1 , x + T + 1 ) ; T = unique ( x + 1 , x + T + 1 ) - x - 1 ; for ( int i = 1 ; i <= T ; i ++ ) { cnt ++ ; new_edge ( cnt , t , m ) ; // printf ( "cnt = %d , m = %d\n" , cnt , m ) ; for ( int j = 1 ; j <= n ; j ++ ) { // printf ( "l = %d , r = %d , i = %d\n" ) ; if ( task[j].l <= x[i] && task[j].r >= x[i] ) { new_edge ( task[j].id , cnt , INF ) ; // printf ( "id = %d\n" , task[j].id ) ; } } if ( i == T || x[i] + 1 >= x[i+1] ) continue ; cnt ++ ; new_edge ( cnt , t , m * (x[i+1] - x[i] - 1) ) ; // printf ( "cnt = %d , fuck = %d\n" , m * (x[i+1] - x[i] - 1) ) ; int l = x[i] + 1 , r = x[i+1] - 1 ; for ( int j = 1 ; j <= n ; j ++ ) { if ( task[j].l <= l && task[j].r >= r ) { new_edge ( task[j].id , cnt , m * ( r - l + 1 ) ) ; } } } if ( need == AC.dinic ( s , t , cnt ) ) puts ( "Yes" ) ; else puts ( "No" ) ; } return 0 ;}/*1 11 1 4 4No1 21 1 4 4Yes1 11 1 1 14 41 1 6 23 2 8 24 3 7 15 4 10 14 41 1 6 33 2 8 34 3 7 25 4 10 24 31 1 6 33 2 8 34 3 7 25 4 10 2*/
0 0
- hdu 2883 kebab(存个最大流模板)
- hdu 2883 kebab(最大流)
- HDU 2883 kebab(离散化+最大流)
- hdu 2883 kebab 【网络最大流】
- HDU 2883 kebab(最大流)
- HDU - 2883 kebab (最大流)
- HDU 2883 kebab 最大流(纯靠建图)
- 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 2883kebab(网络流之最大流)
- HDU 2883 kebab【最大流】(判断是否满流)
- 【HDU】 2883 kebab(最大流+时间段离散化)
- hdu 2883 kebab(最大流dinic邻接表)
- 格雷斯音频大篷车无线音箱回顾
- Unity3D开发:在Unity3D中创建一个山势地形图
- 网络编程 TCP学习
- Geeksquiz | Macro & Preprocessor
- 深入理解计算机系统第二章家庭作业(2.91-2.96)
- hdu 2883 kebab(存个最大流模板)
- Solr查询过程源码分析
- 是潜意识音频优于催眠
- 使用PHP搭建自己的MVC框架
- 【Oracle经典】132个oracle热门精品资料——下载目录
- 为什么浏览器User-agent总是有Mozilla字样——User-agent String里的历史故事
- 是什么让一个录音学校值得旅游的
- 不少程序员都会碰到的三个面试题:如果你只想获取一些面试准备经验,那么你可以直接跳到文章的最后部分
- Linux进程通信之管道和FIFO