BZOJ 2502(清理雪道-上下界网络流)
来源:互联网 发布:vb中chr是什么意思 编辑:程序博客网 时间:2024/06/06 02:40
Description
滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。
Input
输入文件的第一行包含一个整数n (2 <= n <= 100) – 代表滑雪场的地点的数量。接下来的n行,描述1~n号地点出发的斜坡,第i行的第一个数为mi (0 <= mi < n) ,后面共有mi个整数,由空格隔开,每个整数aij互不相同,代表从地点i下降到地点aij的斜坡。每个地点至少有一个斜坡与之相连。
Output
输出文件的第一行是一个整数k – 直升飞机的最少飞行次数。
Sample Input
81 31 72 4 51 81 802 6 50
Sample Output
4
上下界网络流模板已敲熟
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<functional>#include<iostream>#include<cmath>#include<cctype>#include<ctime>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define MAXN (200+10)#define MAXM ((10000)*33+10)#define MAXAi (35000)#define eps (1e-3)long long mul(long long a,long long b){return (a*b)%F;}long long add(long long a,long long b){return (a+b)%F;}long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}typedef long long ll;class Cost_Flow { public: int n,s,t; int q[MAXM]; int edge[MAXM],next[MAXM],pre[MAXN],weight[MAXM],size; int cost[MAXM]; void addedge(int u,int v,int w,int c) { edge[++size]=v; weight[size]=w; cost[size]=c; next[size]=pre[u]; pre[u]=size; } void addedge2(int u,int v,int w,int c){addedge(u,v,w,c),addedge(v,u,0,-c);} bool b[MAXN]; int d[MAXN]; int pr[MAXN],ed[MAXN]; bool SPFA(int s,int t) { For(i,n) d[i]=INF,b[i]=0; d[q[1]=s]=0;b[s]=1; int head=1,tail=1; while (head<=tail) { int now=q[head++]; Forp(now) { int &v=edge[p]; if (weight[p]&&d[now]+cost[p]<d[v]) { d[v]=d[now]+cost[p]; if (!b[v]) b[v]=1,q[++tail]=v; pr[v]=now,ed[v]=p; } } b[now]=0; } return d[t]!=INF; } int totcost; int CostFlow(int s,int t) { int maxflow=0; while (SPFA(s,t)) { int flow=INF; for(int x=t;x^s;x=pr[x]) flow=min(flow,weight[ed[x]]); totcost+=flow*d[t]; maxflow+=flow; for(int x=t;x^s;x=pr[x]) weight[ed[x]]-=flow,weight[ed[x]^1]+=flow; } // cout<<maxflow<<endl; return totcost; } void mem(int n,int t) { (*this).n=n; size=1; totcost=0; MEM(pre) MEM(next) } }S1; int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} int n;int main(){// freopen("bzoj2502.in","r",stdin);// freopen(".out","w",stdout); n=read(); int s=2*n+1,t=s+1,S=t+1,T=S+1; S1.mem(T,T); const int inf = INF; For(i,n) { S1.addedge2(s,i,inf,0); S1.addedge2(i+n,t,inf,0); } For(i,n) { int m=read(); For(j,m) { int v=read(); S1.addedge2(i+n,v,inf,0); S1.addedge2(S,v,1,0); S1.addedge2(i+n,T,1,0); } } For(i,n) { S1.addedge2(i,i+n,inf,0); } S1.addedge(t,s,inf,1); cout<<S1.CostFlow(S,T)<<endl; return 0;}
0 0
- [上下界网络流] BZOJ 2502 清理雪道
- BZOJ 2502(清理雪道-上下界网络流)
- [BZOJ 2502]清理雪道:上下界网络流
- BZOJ 2502 清理雪道 有上下界的网络流
- 【bzoj 2502】清理雪道(有上下界的网络流)
- 【bzoj2502】清理雪道 有上下界的网络流
- 有源汇上下界最小流 BZOJ 2502: 清理雪道
- [上下界有源汇最小流] BZOJ 2502: 清理雪道
- BZOJ 2502 上下界网络流
- 2502: 清理雪道|有上下界的网络流之最小流
- 2502: 清理雪道 有源汇上下界最小流
- 【BZOJ2502】清理雪道【有上下界的最小流】
- [BZOJ2502]清理雪道 有上下界的最小流
- [有上下界最小流] BZOJ2502: 清理雪道
- 【上下界最小流】BZOJ2502 清理雪道
- BZOJ-3876-支线剧情-Ahoi2014-上下界网络流
- [上下界网络流判定] BZOJ 2406 矩阵
- [上下界网络流 二分] BZOJ 3698 XWW的难题
- hdoj-1753-大明A+B
- matlab—load命令读的数据为struct类型的数据的处理方法
- 【克罗地亚】pjesma
- 《Python基础教程》学习笔记 Chap5 条件、循环和其他语句
- Sublime Text2 的emmet 插件用法(初学者)
- BZOJ 2502(清理雪道-上下界网络流)
- EPOLL的用法和模型
- 第十一周项目1(3)
- 专为新手写的:关于IOS HTTP请求的问题和常报的几个错,AFNetworking版
- Android的资源自适应与国际化
- Rxjava——使用RxBus替换EventBus
- 剑指offer17--旋转的方式打印矩阵
- [leetcode]347. Top K Frequent Elements
- 【转】Unity协程(Coroutine)原理深入剖析