【BZOJ】【今日刷的网络流合集】【P1877】【P1834】【P1412】【#1】

来源:互联网 发布:无损音乐下载 知乎 编辑:程序博客网 时间:2024/06/16 00:11

传送门: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:

/*ID:zkyOJ:BZOJIndex:1877Language: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:zkyOJ:BZOJIndex:1834Language: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:zkyOJ:BZOJIndex:1001Language: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;}




0 0
原创粉丝点击