【BZOJ】【2502】清理雪道

网络流/上下界网络流



  带下界的最小可行流……

  我SB了,跑网络流的时候是得从虚拟源0往出跑……而不是S……

  Orz Hzwer

  1 /**************************************************************
  2     Problem: 2502
  3     User: Tunix
  4     Language: C++
  5     Result: Accepted
  6     Time:3080 ms
  7     Memory:10652 kb
  8 ****************************************************************/
  9
 10 //BZOJ 2502
 11 #include<vector>
 12 #include<cstdio>
 13 #include<cstdlib>
 14 #include<cstring>
 15 #include<iostream>
 16 #include<algorithm>
 17 #define rep(i,n) for(int i=0;i<n;++i)
 18 #define F(i,j,n) for(int i=j;i<=n;++i)
 19 #define D(i,j,n) for(int i=j;i>=n;--i)
 20 using namespace std;
 21 int getint(){
 22     int v=0,sign=1; char ch=getchar();
 23     while(ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();}
 24     while(ch>=‘0‘&&ch<=‘9‘) {v=v*10+ch-‘0‘; ch=getchar();}
 25     return v*sign;
 26 }
 27 typedef long long LL;
 28 const int N=100010,M=500010,INF=~0u>>2;
 29 /*******************tamplate********************/
 30 int n,m,ans;
 31 struct edge{int to,v;};
 32 struct Net{
 33     edge E[M];
 34     int head[N],next[M],cnt;
 35     void ins(int x,int y,int z){
 36         E[++cnt]=(edge){y,z};
 37         next[cnt]=head[x]; head[x]=cnt;
 38     }
 39     void add(int x,int y,int z){
 40         ins(x,y,z); ins(y,x,0);
 41     }
 42     int S,T,d[N],cur[N],Q[M];
 43     bool mklevel(){
 44         int l=0,r=-1;
 45         F(i,0,T) d[i]=-1;
 46         d[0]=0; Q[++r]=0;
 47         while(l<=r){
 48             int x=Q[l++];
 49             for(int i=head[x];i;i=next[i])
 50                 if(E[i].v && d[E[i].to]==-1){
 51                     d[E[i].to]=d[x]+1;
 52                     Q[++r]=E[i].to;
 53                 }
 54         }
 55         return d[T]!=-1;
 56     }
 57     int dfs(int x,int a){
 58         if (x==T) return a;
 59         int flow=0;
 60         for(int &i=cur[x];i && flow<a;i=next[i])
 61             if (E[i].v && d[E[i].to]==d[x]+1){
 62                 int f=dfs(E[i].to,min(E[i].v,a-flow));
 63                 E[i].v-=f;
 64                 E[i^1].v+=f;
 65                 flow+=f;
 66             }
 67         if (!flow) d[x]=-1;
 68         return flow;
 69     }
 70     void Dinic(){
 71         while(mklevel()){
 72             F(i,0,T) cur[i]=head[i];
 73             ans+=dfs(0,INF);
 74         }
 75     }
 76     int in[N];
 77     void init(){
 78         n=getint(); cnt=1; m=0;
 79         F(i,1,n){
 80             int x=getint(),y;
 81             F(j,1,x){
 82                 y=getint(); m++;
 83                 add(i,n+2*m-1,INF);
 84                 add(n+2*m,y,INF);
 85             }
 86         }
 87         S=n+m+m+1; T=S+1; ans=0;
 88         F(i,1,m){
 89             add(n+2*i-1,n+2*i,INF);
 90             in[n+2*i-1]--; in[n+2*i]++;
 91         }
 92         F(i,1,n) add(S,i,INF);
 93         F(i,n+1,n+m+m)
 94             if(in[i]>0) add(0,i,in[i]);
 95             else add(i,T,-in[i]);
 96         for(int i=1;;i++){
 97             add(0,S,1);
 98             Dinic();
 99             if (ans==m){printf("%d\n",i);break;}
100         }
101     }
102 }G1;
103 int main(){
104     #ifndef ONLINE_JUDGE
105     freopen("input.txt","r",stdin);
106 //  freopen("output.txt","w",stdout);
107     #endif
108     G1.init();
109     return 0;
110 }

时间: 2024-10-12 15:25:05

【BZOJ】【2502】清理雪道的相关文章

bzoj 2502: 清理雪道 最小流

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 466[Submit][Status][Discuss] Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出

bzoj 2502 清理雪道 (有源汇上下界最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费

BZOJ 2502: 清理雪道 | 有上下界最小流

#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define N 405 #define INF 0x3f3f3f3f #define M 200005 using namespace std; int head[N],cur[N],n,m,S,T,d[N],s,t,sum,ecnt=1,lev[N],ans,dec; queue<int> q; st

[BZOJ2502]清理雪道 有上下界网络流(最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费

bzoj2502 清理雪道

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 307  Solved: 150 [Submit][Status][id=2502" style="color:blue; text-decoration:none">Discuss] Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中俯视,滑雪场能够看作一个有向无环图.每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你

【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出

[BZOJ2502]清理雪道解题报告|带下界的最小流

滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务. 题意就是给定一张DAG,求每条边起码经过一次求覆盖所有边的最小路径条数

BZOJ_2502_清理雪道_有源汇上下界最小流

Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务. Input 输入文件的第一行包含一个整数n (2

P4843 清理雪道(上下界网络流)

P4843 清理雪道 上下界最小流 我们先搞一遍上下界可行流(转) 回忆上下界最大流的写法:在可行流的残量网络$s\ -\ t$上跑最大流,答案为可行流$+$残量网络的最大流 那么上下界最小流的写法呢? 只要在残量网络$t\ -\ s$上跑最大流,答案就是可行流$-$残量网络$t\ -\ s$的最大流辣 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using na