滑雪場坐落在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省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方...