bzoj2502 清理雪道 上下界網路流

2021-08-21 12:55:11 字數 1699 閱讀 7443

滑雪場坐落在fj省西北部的若干座山上。

從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡(即雪道),弧的方向代表斜坡下降的方向。

你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。

由於每次飛行的耗費是固定的,為了最小化耗費,你想知道如何用最少的飛行次數才能完成清理雪道的任務。

2 <= n <= 100

考慮直接網路流要怎麼搞。對於入度為0的點連源點,出度為0的點連匯點,斜坡就連費用為[1,inf]的邊

注意到我們要求的是乙個有上下界的最小流,然後我就學習了一波上下界網路流( ̄▽ ̄)」

(下面的各種流都是有上下界的網路流)

建圖方法:

新建超級源點匯點ss和tt,對於原圖中的一條邊(x,y,[l,r])我們連(ss,y,l),(tt,x,l),(x,y,r-l)

若是有源匯的圖就多連一條(t,s,inf),其餘同上

存在可行流當且僅當ss的邊全部滿流

最小流可以二分答案mid,把s和t的連邊變為(t,s,mid)跑可行流判斷

最大流同理

最小費用流直接在邊上加權,其他不變

#include 

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define fill(x,t) memset(x,t,sizeof(x))

#define copy(x,t) memcpy(x,t,sizeof(x))

const

int inf=0x3f3f3f3f;

const

int n=2005;

const

int e=400005;

std:: queue

que;

struct edge e[e];

int dis[n],d[n],s,t,ss,tt;

int cur[n],ls[n],edcnt=1;

void add_edge(int x,int y,int w) ; ls[x]=edcnt;

e[++edcnt]=(edge) ; ls[y]=edcnt;

}bool bfs(int st,int ed) }}

return

false;

}int find(int now,int ed,int mn)

}return ret;

}int dinic(int st,int ed)

return ret;

}bool check(int mid,int n)

e[edcnt^1].w=mid;

dinic(ss,tt);

bool flag=true;

for (int i=ls[ss];i;i=e[i].next)

return flag;

}int main(void)

}rep(i,1,n) if (!d[i])

add_edge(t,s,inf);

int l=1,r=inf;

while (l<=r)

printf("%d\n", r+1);

return

0;}

BZOJ 2502 清理雪道 上下界網路流

description 滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。由...

上下界網路流 bzoj2502 清理雪道

模型 無源匯有上下界可行流ljn 模板題吧 滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。...

有源匯上下界最小流 BZOJ 2502 清理雪道

time limit 10 sec memory limit 128 mb submit 1039 solved 561 submit status discuss 滑雪場坐落在 fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方...