您的位置:首页 > 理论基础 > 计算机网络

【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:

/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bzoj 网络流