最大流
- 模板题们
poj3469
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<queue> 5 using namespace std; 6 #define maxm 450000 7 #define maxn 20005 8 #define inf 0x3f3f3f3f 9 queue<int>Q; 10 int cnt,v[maxm<<1],Next[maxm<<1],w[maxm<<1],first[maxn],cur[maxn]; 11 int SSS,TTT,dep[maxn]; 12 void add(int st,int end,int val){ 13 v[cnt]=end;w[cnt]=val;Next[cnt]=first[st];first[st]=cnt++; 14 v[cnt]=st;w[cnt]=0;Next[cnt]=first[end];first[end]=cnt++; 15 } 16 bool bfs(){ 17 memset(dep,0,sizeof(dep)); 18 dep[SSS]=1; 19 Q.push(SSS); 20 while(!Q.empty()){ 21 int x=Q.front();Q.pop(); 22 for(int e=first[x];e!=-1;e=Next[e]){ 23 if(!dep[v[e]]&&w[e]>0){ 24 dep[v[e]]=dep[x]+1; 25 Q.push(v[e]); 26 } 27 } 28 } 29 return dep[TTT]; 30 } 31 int dfs(int x,int lim){ 32 if(x==TTT)return lim; 33 int lim1=lim; 34 for(int e=cur[x];e!=-1;e=Next[e]){ 35 if(dep[v[e]]==dep[x]+1&&w[e]>0){ 36 int flow=dfs(v[e],min(w[e],lim)); 37 cur[x]=e; 38 w[e]-=flow;w[e^1]+=flow; 39 if((lim-=flow)<=0)break; 40 } 41 } 42 if(lim==lim1)dep[x]=0; 43 return lim1-lim; 44 } 45 int main(){ 46 int n,m,a,b,c; 47 scanf("%d%d",&n,&m); 48 SSS=n+1;TTT=n+2; 49 memset(first,-1,sizeof(first)); 50 for(int i=1;i<=n;i++){ 51 scanf("%d%d",&a,&b); 52 add(SSS,i,a);add(i,TTT,b); 53 } 54 for(int i=1;i<=m;i++){ 55 scanf("%d%d%d",&a,&b,&c); 56 add(a,b,c);add(b,a,c); 57 } 58 int ans=0; 59 while(bfs()){ 60 memcpy(cur,first,sizeof(first)); 61 ans+=dfs(SSS,inf); 62 } 63 printf("%d\n",ans); 64 return 0; 65 }
学习了一个当前【胡】优化,发现其实刘as*hole的模板并没有用到呢~
之前以为prey老父亲给的模板里if(lim==lim1)dep[x]=0;就是当前弧优化,然而并不是的样子,,,原因是什么呢——因为加了cur之后变快啦lululu~
- 百度搜索poj网络流小结,感觉get了什么了不起的技能
poj1698
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<algorithm> 3 #include<vector> 4 #include<queue> 5 #include<string.h> 6 using namespace std; 7 8 #define inf 0x3f3f3f3f 9 #define maxn 7500 10 queue<int>Q; 11 int cnt,v[maxn<<1],w[maxn<<1],next[maxn<<1],first[maxn]; 12 int T,SSS,TTT,dep[maxn],cur[maxn]; 13 void clear(){ 14 cnt=0; 15 memset(first,-1,sizeof(first)); 16 } 17 void add(int st,int end,int val){ 18 v[cnt]=end;w[cnt]=val;next[cnt]=first[st];first[st]=cnt++; 19 v[cnt]=st;w[cnt]=0;next[cnt]=first[end];first[end]=cnt++; 20 } 21 bool bfs(int sss){ 22 memset(dep,0,sizeof(dep)); 23 Q.push(sss); 24 dep[sss]=1; 25 while(!Q.empty()){ 26 int x=Q.front();Q.pop(); 27 for(int e=first[x];e!=-1;e=next[e]){ 28 if(!dep[v[e]]&&w[e]>0){ 29 dep[v[e]]=dep[x]+1; 30 Q.push(v[e]); 31 } 32 } 33 } 34 return dep[TTT]; 35 } 36 int dfs(int sss,int lim){ 37 if(sss==TTT)return lim; 38 int lim1=lim; 39 for(int e=cur[sss];e!=-1;e=next[e]){ 40 if(dep[v[e]]==dep[sss]+1&&w[e]>0){ 41 int flow=dfs(v[e],min(lim,w[e])); 42 cur[sss]=e; 43 w[e]-=flow;w[e^1]+=flow; 44 if((lim-=flow)<=0)break; 45 } 46 } 47 if(lim==lim1)dep[sss]=0; 48 return lim1-lim; 49 } 50 int main(){ 51 freopen("1.in","r",stdin); 52 scanf("%d",&T); 53 while(T--){ 54 int n,x,d,w,ww=0,sum=0,ans=0; 55 clear(); 56 scanf("%d",&n); 57 SSS=0; 58 for(int i=1;i<=n;i++){ 59 vector<int>yooo; 60 for(int j=1;j<=7;j++){ 61 scanf("%d",&x); 62 if(x)yooo.push_back(j); 63 } 64 scanf("%d%d",&d,&w); 65 ww=max(ww,w); 66 sum+=d;add(SSS,i,d); 67 for(int j=1;j<=w;j++) 68 for(int k=0;k<yooo.size();k++) 69 add(i,n+(j-1)*7+yooo[k],1); 70 } 71 TTT=n+ww*7+1; 72 for(int i=n+1;i<TTT;i++)add(i,TTT,1); 73 while(bfs(SSS)){ 74 memcpy(cur,first,sizeof(first)); 75 ans+=dfs(SSS,inf); 76 } 77 if(ans==sum)printf("Yes\n"); 78 else printf("No\n"); 79 } 80 return 0; 81 }
建图比较简单的一道题,数据范围算错,re了一发
poj2112
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<queue> 5 using namespace std; 6 7 #define inf 0x3f3f3f3f 8 #define maxn 250 9 #define maxm 100000 10 queue<int>Q; 11 int K,C,M,cnt; 12 int SSS,TTT,v[maxm<<1],w[maxm<<1],Next[maxm<<1],first[maxm],map[maxn][maxn],dep[maxn]; 13 14 void add(int st,int end,int val){ 15 v[cnt]=end;w[cnt]=val;Next[cnt]=first[st];first[st]=cnt++; 16 v[cnt]=st;w[cnt]=0;Next[cnt]=first[end];first[end]=cnt++; 17 } 18 bool bfs(){ 19 memset(dep,0,sizeof(dep)); 20 dep[SSS]=1; 21 Q.push(SSS); 22 while(!Q.empty()){ 23 int x=Q.front();Q.pop(); 24 for(int e=first[x];e!=-1;e=Next[e]){ 25 if(!dep[v[e]]&&w[e]){ 26 dep[v[e]]=dep[x]+1; 27 Q.push(v[e]); 28 } 29 } 30 } 31 return dep[TTT]; 32 } 33 int dfs(int x,int lim){ 34 if(x==TTT)return lim; 35 int tmp=lim; 36 for(int e=first[x];e!=-1;e=Next[e]){ 37 if(dep[v[e]]==dep[x]+1&&w[e]>0){ 38 int flow=dfs(v[e],min(lim,w[e])); 39 w[e]-=flow; 40 w[e^1]+=flow; 41 if((lim-=flow)<=0)break; 42 } 43 } 44 if(lim==tmp)dep[x]=0; 45 return tmp-lim; 46 } 47 int Dinic(){ 48 int ans=0; 49 while(bfs())ans+=dfs(SSS,0x3f3f3f3f); 50 return ans; 51 } 52 void floyd(){ 53 for(int k=1;k<=K+C;k++) 54 for(int i=1;i<=K+C;i++) 55 for(int j=1;j<=K+C;j++) 56 map[i][j]=min(map[i][j],map[i][k]+map[k][j]); 57 } 58 int main(){ 59 scanf("%d%d%d",&K,&C,&M); 60 for(int i=1;i<=K+C;i++) 61 for(int j=1;j<=K+C;j++){ 62 scanf("%d",&map[i][j]); 63 if(!map[i][j])map[i][j]=inf; 64 } 65 floyd(); 66 SSS=0,TTT=K+C+1; 67 int l=inf,r=0; 68 for(int i=1;i<=K+C;i++) 69 for(int j=1;j<=K+C;j++){ 70 l=min(l,map[i][j]); 71 r=max(r,map[i][j]); 72 } 73 while(l<r){ 74 int mid=(l+r)>>1; 75 memset(first,-1,sizeof(first)); 76 cnt=0; 77 for(int i=K+1;i<=K+C;i++){ 78 add(SSS,i,1); 79 for(int j=1;j<=K;j++) 80 if(map[i][j]<=mid)add(i,j,1); 81 } 82 for(int i=1;i<=K;i++)add(i,TTT,M); 83 if(Dinic()<C)l=mid+1; 84 else r=mid; 85 } 86 printf("%d\n",l); 87 return 0; 88 }
第一道二分+网络流,感觉有点神,floyd最短路,然后二分最短时间,不满足时间的点之间不连边,最大流判断可行性
poj1149
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<algorithm> 3 #include<queue> 4 #include<string.h> 5 using namespace std; 6 7 #define inf 0x3f3f3f3f 8 #define maxn 105 9 #define maxm 1005 10 #define maxe 10500 11 queue<int>Q; 12 int cnt,v[maxe<<1],w[maxe<<1],next[maxe<<1],first[maxn],cur[maxn]; 13 int SSS,TTT,dep[maxn],pig[maxm],last[maxm]; 14 15 void add(int st,int end,int val){ 16 v[cnt]=end;w[cnt]=val;next[cnt]=first[st];first[st]=cnt++; 17 v[cnt]=st;w[cnt]=0;next[cnt]=first[end];first[end]=cnt++; 18 } 19 bool bfs(){ 20 memset(dep,0,sizeof(dep)); 21 dep[SSS]=1; 22 Q.push(SSS); 23 while(!Q.empty()){ 24 int x=Q.front();Q.pop(); 25 for(int e=first[x];e!=-1;e=next[e]){ 26 if(!dep[v[e]]&&w[e]>0){ 27 dep[v[e]]=dep[x]+1; 28 Q.push(v[e]); 29 } 30 } 31 } 32 return dep[TTT]; 33 } 34 int dfs(int x,int lim){ 35 if(x==TTT)return lim; 36 int lim1=lim; 37 for(int e=cur[x];e!=-1;e=next[e]){ 38 if(dep[v[e]]==dep[x]+1&&w[e]>0){ 39 int flow=dfs(v[e],min(lim,w[e])); 40 cur[x]=e; 41 w[e]-=flow;w[e^1]+=flow; 42 if((lim-=flow)<=0)break; 43 } 44 } 45 if(lim==lim1)dep[x]=0; 46 return lim1-lim; 47 } 48 int main(){ 49 freopen("1.in","r",stdin); 50 int n,m,a,b,x; 51 memset(first,-1,sizeof(first)); 52 scanf("%d%d",&n,&m); 53 SSS=0,TTT=m+1; 54 for(int i=1;i<=n;i++) 55 scanf("%d",&pig[i]); 56 for(int i=1;i<=m;i++){ 57 scanf("%d",&a); 58 int sum=0; 59 for(int j=1;j<=a;j++){ 60 scanf("%d",&x); 61 if(!last[x])sum+=pig[x],last[x]=i; 62 else add(last[x],i,inf); 63 } 64 if(sum)add(SSS,i,sum); 65 scanf("%d",&b); 66 add(i,TTT,b); 67 } 68 int ans=0; 69 while(bfs()){ 70 memcpy(cur,first,sizeof(first)); 71 ans+=dfs(SSS,inf); 72 } 73 printf("%d\n",ans); 74 return 0; 75 }
建图有点6,然而不清真,就不具体写了。。。
- 坑B题,,,太坑了,还没A呢