【BZOJ】【今日刷的网络流合集】【P1877】【P1834】【P1412】【#1】
2014-03-08 18:47
429 查看
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1877
http://www.lydsy.com/JudgeOnline/problem.php?id=1834
http://www.lydsy.com/JudgeOnline/problem.php?id=1412
【SDOI2009】【P1877】【晨跑】
把一个点拆成两个,连一条cap=1 cost=0的弧,其他边<x,y,w>cap=1 cost=w(不太理解,写成cap=INF只有40分),s点和t点的cap=INF cost=0
Code:
【ZJOI2010】【P1834】【网络扩容】
裸的最大流+最小费用最大流……
Code:
狼---羊 狼--空白 羊--狼 羊--空白 空白--空白 超级源点汇点连狼和羊,最大流即可
Code:
http://www.lydsy.com/JudgeOnline/problem.php?id=1834
http://www.lydsy.com/JudgeOnline/problem.php?id=1412
【SDOI2009】【P1877】【晨跑】
把一个点拆成两个,连一条cap=1 cost=0的弧,其他边<x,y,w>cap=1 cost=w(不太理解,写成cap=INF只有40分),s点和t点的cap=INF cost=0
Code:
/* ID:zky OJ:BZOJ Index:1877 Language:C++ */ #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<climits> #include<iostream> #include<algorithm> #define clear(x) memset(x,0,sizeof(x)) #define inf(x) memset(x,0x7f,sizeof(x)) #define Size G[u].size() #define read2(x,y) scanf("%d%d",&x,&y) #define read3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define read4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) using namespace std; int s,t; int n,m,k; const int INF=INT_MAX; struct edge{ int u,v,cap,flow,cost; }; vector<edge>edges; vector<vector<int> >G; int d[1001]; int cur[1001]; int vis[1001]; int prev[1001]; void add(int u,int v,int cap,int cost){ edges.push_back((edge){u,v,cap,0,cost}); G[u].push_back(edges.size()-1); } bool bfs(){ clear(d);clear(vis); queue<int>q; q.push(s); vis[s]=1; while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<Size;i++){ edge &e=edges[G[u][i]]; if(!vis[e.v]&&e.cap>e.flow){ vis[e.v]=1; d[e.v]=d[u]+1; q.push(e.v); } } } return vis[t]; } int dfs(int x,int a){ if(x==t||a==0)return a; int flow=0,f; for(int &i=cur[x];i<G[x].size();i++){ edge &e=edges[G[x][i]]; if(d[e.v]==d[x]+1&&(f=dfs(e.v,min(a,e.cap-e.flow)))>0){ flow+=f; e.flow+=f; edges[G[x][i]^1].flow-=f; a-=f; if(!a)break; } } return flow; } void Dinic(){ int flow=0; while(bfs()){ clear(cur); int x; while(x=dfs(s,INF)){ flow+=x; } //flow+=dfs(s,INF); } cout<<flow<<" "; } int a[1001]; bool spfa(int &flow,int &cost){ queue<int>q; q.push(s); memset(d,0x7f,sizeof(d)); memset(vis,0,sizeof(vis)); int B=d[0]; d[s]=0; vis[s]=1; a[s]=INF; while(!q.empty()){ int u=q.front();q.pop();vis[u]=0; for(int i=0;i<G[u].size();i++){ edge &e=edges[G[u][i]]; if(e.cap-e.flow>0&&d[e.v]>d[u]+e.cost){ d[e.v]=d[u]+e.cost; prev[e.v]=G[u][i]; a[e.v]=min(a[u],e.cap-e.flow); if(!vis[e.v]){ vis[e.v]=1; q.push(e.v); } } } } if(d[t]==B)return false; int u=t; flow+=a[t]; cost+=a[t]*d[t]; while(u!=s){ edges[prev[u]].flow+=a[t]; edges[prev[u]^1].flow-=a[t]; u=edges[prev[u]].u; } return true; } void costflow(){ int flow=0,cost=0; while(spfa(flow,cost)); cout<<flow<<" "; cout<<cost<<endl; } int main(){ read2(n,m); G.resize(n*2+10); s=1;t=n; add(s,s+n,INF,0); add(s+n,s,0,0); for(int i=2;i<n;i++){ add(i,i+n,1,0); add(i+n,i,0,0); } add(t,t+n,INF,0); add(t+n,t,0,0); t=t+n; // s=1;t=n; for(int i=1;i<=m;i++){ int u,v,w; read3(u,v,w); add(u+n,v,1,w); add(v,u+n,0,-w); } // s=1;t=n; int deb=0; if(deb){ for(int i=0;i<edges.size();i++){ if(i%2==0) printf("#%d %d -> %d cap:%d cost:%d \n" ,i,edges[i].u,edges[i].v,edges[i].cap,edges[i].cost); } } costflow(); return 0; }
【ZJOI2010】【P1834】【网络扩容】
裸的最大流+最小费用最大流……
Code:
/* ID:zky OJ:BZOJ Index:1834 Language:C++ */ #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<climits> #include<iostream> #include<algorithm> #define clear(x) memset(x,0,sizeof(x)) #define inf(x) memset(x,0x7f,sizeof(x)) #define Size G[u].size() #define read3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define read4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) using namespace std; int s,t; int n,m,k; const int INF=INT_MAX; struct edge{ int u,v,cap,flow,cost; }; vector<edge>edges; vector<vector<int> >G; int d[1001]; int cur[1001]; int vis[1001]; int prev[1001]; void add(int u,int v,int cap,int cost){ edges.push_back((edge){u,v,cap,0,cost}); G[u].push_back(edges.size()-1); } bool bfs(){ clear(d);clear(vis); queue<int>q; q.push(s); vis[s]=1; while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<Size;i++){ edge &e=edges[G[u][i]]; if(!vis[e.v]&&e.cap>e.flow){ vis[e.v]=1; d[e.v]=d[u]+1; q.push(e.v); } } } return vis[t]; } int dfs(int x,int a){ if(x==t||a==0)return a; int flow=0,f; for(int &i=cur[x];i<G[x].size();i++){ edge &e=edges[G[x][i]]; if(d[e.v]==d[x]+1&&(f=dfs(e.v,min(a,e.cap-e.flow)))>0){ flow+=f; e.flow+=f; edges[G[x][i]^1].flow-=f; a-=f; if(!a)break; } } return flow; } void Dinic(){ int flow=0; while(bfs()){ clear(cur); int x; while(x=dfs(s,INF)){ flow+=x; } //flow+=dfs(s,INF); } cout<<flow<<" "; } int a[1001]; bool spfa(int &flow,int &cost){ queue<int>q; q.push(s); memset(d,0x7f,sizeof(d)); memset(vis,0,sizeof(vis)); int B=d[0]; d[s]=0; vis[s]=1; a[s]=INF; while(!q.empty()){ int u=q.front();q.pop();vis[u]=0; for(int i=0;i<G[u].size();i++){ edge &e=edges[G[u][i]]; if(e.cap-e.flow>0&&d[e.v]>d[u]+e.cost){ d[e.v]=d[u]+e.cost; prev[e.v]=G[u][i]; a[e.v]=min(a[u],e.cap-e.flow); if(!vis[e.v]){ vis[e.v]=1; q.push(e.v); } } } } if(d[t]==B)return false; int u=t; flow+=a[t]; cost+=a[t]*d[t]; while(u!=s){ edges[prev[u]].flow+=a[t]; edges[prev[u]^1].flow-=a[t]; u=edges[prev[u]].u; } return true; } void costflow(){ int flow=0,cost=0; while(spfa(flow,cost)); cout<<cost<<endl; } int main(){ read3(n,m,k); G.resize(n+1); int u[5001],v[5001],c[5001],w[5001]; for(int i=1;i<=m;i++){ read4(u[i],v[i],c[i],w[i]); add(u[i],v[i],c[i],0); add(v[i],u[i],0,0); } s=1;t=n; Dinic(); s=0; add(s,1,k,0); for(int i=1;i<=m;i++){ add(u[i],v[i],k,w[i]); add(v[i],u[i],0,0); } costflow(); return 0; }【ZJOI2009】【P1412】【狼和羊的故事】
狼---羊 狼--空白 羊--狼 羊--空白 空白--空白 超级源点汇点连狼和羊,最大流即可
Code:
/* ID:zky OJ:BZOJ Index:1001 Language:C++ */ #include<vector> #include<queue> #include<cstdio> #include<cstring> #include<climits> #include<iostream> #include<algorithm> #define read(x) scanf("%d",&x) using namespace std; struct edge{ int v,cap,flow; edge(int _v,int _cap,int _flow): v(_v),cap(_cap),flow(_flow){ } }; int mm; int n,m,n1=0,n2=0; vector<vector<int> >G; vector<edge>edges; void add(int u,int v,int cap){ edges.push_back(edge(v,cap,0)); mm=edges.size(); G[u].push_back(mm-1); } const int INF=INT_MAX; int tot=0; int s,t; const int dx[4]={0,1,0,-1}; const int dy[4]={1,0,-1,0}; int d[1000001]; bool vis[1000001]; int cur[1000001]; bool bfs(){ memset(d,0,sizeof(d)); memset(vis,0,sizeof(vis)); queue<int>q; q.push(s); d[s]=0; vis[s]=1; while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<G[u].size();i++){ edge &e=edges[G[u][i]]; if(!vis[e.v]&&e.cap>e.flow){ vis[e.v]=1; d[e.v]=d[u]+1; q.push(e.v); } } } return vis[t]; } int sum=0; int dfs(int x,int a){ if(x==t||a==0)return a; int flow=0,f; for(int &i=cur[x];i<G[x].size();i++){ edge &e=edges[G[x][i]]; if(d[e.v]==d[x]+1&&(f=dfs(e.v,min(a,e.cap-e.flow)))>0){ flow+=f; e.flow+=f; edges[G[x][i]^1].flow-=f; a-=f; if(!a)break; } } return flow; } void Dinic(){ int flow=0; while(bfs()){ memset(cur,0,sizeof(cur)); flow+=dfs(s,INF); } cout<<flow<<endl; } int map[220][220]; void init(){ vector<vector<int> >hash; read(n);read(m); G.resize(n*m+2); hash.resize(n*m+1); for(int i=1;i<=n;i++)hash[i].resize(n*m+1); s=0;t=n*m+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ hash[i][j]=++tot; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ read(map[i][j]); if(map[i][j]==1){ add(s,hash[i][j],INF); add(hash[i][j],s,0); }else{ if(map[i][j]==2){ add(hash[i][j],t,INF); add(t,hash[i][j],0); } } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ for(int k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(x<1||y<1||x>n||y>m||(map[i][j]==map[x][y]&&map[i][j]))continue; add(hash[i][j],hash[x][y],1); add(hash[x][y],hash[i][j],0); } } int w; int DEB=0; if(DEB){ for(int i=0;i<edges.size();i++){ printf("#%d -> %d cap:%d\n",i,edges[i].v,edges[i].cap); } } } int main(){ init(); Dinic(); return 0; }
相关文章推荐
- Poj2638 网络流+最短路+二分答案
- POJ1273-Drainage Ditches
- [bzoj1003] [ZJOI2006]物流运输trans
- 网络流算法整理
- [bzoj1500][NOI2005]维修数列
- [bzoj1208] [HNOI2004]宠物收养所
- [bzoj1269][AHOI2006]文本编辑器editort
- [bzoj1503][NOI2004]郁闷的出纳员
- BZOJ 3180 coci2012 ograda
- [网络流24题 #2]太空飞行计划问题
- [网络流24题 #18]分配问题
- [网络流24题 #2]太空飞行计划问题
- [网络流24题 #1]飞行员配对方案问题
- [USACO 4.2.1] Drainage Ditches
- [网络流24题 #18]分配问题
- [USACO 4.2.1] Drainage Ditches
- 有上下界的网络流专辑
- 线性规划与网络流24题
- bzoj 1801: [Ahoi2009] chess 中国象棋
- bzoj 1717: [Usaco2006 Dec] Milk Patterns