网络流EK算法洛谷P3376 day4
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 5e3 + 5; 5 ll n, m, s, t, ee = 2; 6 int flg[1000][1000], vis[1000], h[1000]; 7 struct edge{ 8 ll v, next, val; 9 }e[N << 1]; 10 11 void addedge(ll u, ll v, ll w) 12 { 13 e[ee] = (edge){v, h[u], w}; 14 h[u] = ee++; 15 } 16 17 struct Pre{ 18 ll v, e_id; 19 }pre[N]; 20 21 ll bfs() 22 { 23 memset(vis, 0, sizeof(vis)); 24 //memset(pre, -1, sizeof(pre)); 25 vis[s] = 1; 26 queue<int>q; 27 q.push(s); 28 while(q.size()) 29 { 30 ll u = q.front(); 31 q.pop(); 32 for(ll i = h[u]; i; i = e[i].next) 33 { 34 ll v = e[i].v; 35 if(!vis[v] && e[i].val) 36 { 37 pre[v].v = u; 38 pre[v].e_id = i; 39 if(v == t)return 1; 40 vis[v] = 1; 41 q.push(v); 42 } 43 } 44 } 45 return 0; 46 } 47 ll EK() 48 { 49 ll ans = 0; 50 while(bfs()) 51 { 52 ll mi = INT_MAX; 53 for(int i = t; i != s; i = pre[i].v)mi = min(mi, e[pre[i].e_id].val); 54 for(int i = t; i != s; i = pre[i].v) 55 { 56 e[pre[i].e_id].val -= mi; 57 e[pre[i].e_id ^ 1].val += mi; 58 } 59 ans += mi; 60 } 61 return ans; 62 } 63 int main() 64 { 65 ios::sync_with_stdio(false); cin.tie(0); 66 //freopen("P3376_9.in","r",stdin); 67 cin >> n >> m >> s >> t; 68 ll u, v, w; 69 for(int i = 1; i <= m; i++) 70 { 71 cin >> u >> v >> w; 72 if(!flg[u][v]) 73 { 74 flg[u][v] = ee; 75 addedge(u, v, w); 76 addedge(v, u, 0); 77 } 78 else e[flg[u][v]].val += w; 79 } 80 cout << EK() <<"\n"; 81 return 0; 82 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)