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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信零钱超额了怎么办 微信的充值冲错了怎么办 有流量还扣话费怎么办 自动取款机充值到电子账户怎么办 淘宝qb充错了怎么办 q币冲错了人家不给怎么办 qq充值话费错号怎么办 qq充错号码了怎么办 qq交话费不到账怎么办 充错手机号码而且是空号怎么办 微信钱包充错话费怎么办 QQ充值话费充到空号了怎么办 给别人充错话费怎么办 用qq交错话费对方是空号怎么办 号码变成空号了怎么办 qq冲流量冲错了怎么办 流量冲错了套餐怎么办 微信流量充错号码怎么办 微信支付不进账怎么办 充话费充不进去怎么办 用支付宝充话费没到账怎么办 支付宝充话费未到账怎么办 话费充了不到账怎么办 转转买家不确认收货怎么办 充话费错了怎么办啊 淘宝充值流量没到账怎么办 微信手机充错了怎么办 支付宝充话费没到账怎么办 裤子摔了一个洞怎么办 顾客反应衣服质量不好怎么办 淘宝买的衣服味道很大怎么办 三国杀账号忘了怎么办 宽带连接被删了 怎么办 手机被偷了qq怎么办 手机丢了微信怎么办啊 手机店把手机修坏了怎么办 在手机店买到山寨机手机怎么办 有人在qq群上骂我怎么办 qq群一直有人骚扰怎么办 苹果手机QQ图标不在桌面上怎么办 苹果手机长按不能删除怎么办