首先是一些概念,容量,流量,飽和弧,非飽和弧,零弧,非零弧,增廣路,殘量,殘量網路
這個方法的時間複雜度比較差 為
一直bfs找增廣路,直到找不到演算法結束,每次找到後,修改正向邊和反向邊的邊權即可
**
#includeusing namespace std;
int n,m,s,t;
const int inf=pow(2,31)-1;
const int maxm=5e3+3;
const int maxn=205;
vector g[maxn];
long long ans,flow;
long long dis[maxn][maxn];
int pre[maxn];
void bfs()
} }}void ek()
}int main()
ek();
printf("%lld\n",ans);
return 0;
}
//這個ek再洛谷p3376上會t兩個點
首先通過bfs分層,然後用dfs多路同時增廣
時間複雜度
**
#includeusing namespace std;
int n,m,s,t;
const long long inf=1e18;
const int maxm=1e4+3;
const int maxn=205;
struct edge
e[maxm<<1];
long long ans,dis[maxn];
int head[maxn],cnt=1;
void add(int x,int y,int z)
bool bfs()
} }return (dis[t]!=-1);
}long long dfs(int x,long long flow)
} if(!res) dis[x]=-1;
return res;
}void dinic()
}int main()
dinic();
printf("%lld\n",ans);
return 0;
}
寫反向邊 (^1) 的時候,cnt一定要從1開始啊,查了好長時間!!!就是最大流=最小割,建模時常用
先用dinic求出最大流,然後dfs遍歷剩餘網路中所有被遍歷的點存在集合s中即可
用spfa來找增廣路增廣,spfa的距離就是費用
**
#includeusing namespace std;
int n,m,s,t;
const int maxn=5e3+5;
const int inf=pow(2,31)-1;
const int maxm=5e4+5;
struct edge
e[maxm<<1];
int head[maxn],cnt=1;
void add(int x,int y,int a,int b)
int vis[maxn],dis[maxn],pre[maxn];
bool spfa()
}} }
return (pre[t]!=-1);
}void mcmf()
ans+=flow;
} printf("%d %d\n",ans,res);
}int main()
mcmf();
return 0;
}
bzoj1834(網路流 費用流)
給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。第一問裸的網路流 第二問 新建乙個匯點,將n號點與匯點相連,容量為k,限制最多增大的流量 費用為0 將原先每一條邊都新...
bzoj1834 網路擴容 網路流
好久沒寫題解了啊 給你一幅n個點的網路,先求出其1到n的最大流,每條弧還會有個屬性co sti cos ti 表示沒擴容乙個單位的費用,現在我們要求的就是擴容k個單位的最小費用 這是一道比較裸的網路流,第一問直接dinic就是了,重點就在於第二問。我們把第一問的殘量網路繼續利用,其中的每條弧的費用都...
網路流初步
問題 最大流問題 假設 把一些物品從結點s 源點 運送到t 匯點 可以從其他結點中轉。1.容量 對於一條邊 u,v 它的物品上限成為容量,記為c u,v 2.流量 實際運送的物品成為流量,記為f u,v 目標 最大化從s點流出的淨流量,即最大化 容量c與流量f滿足3個性質 1.容量限制 對g中的每條...