#include<bits/stdc++.h>#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)#define Set(a, v) memset(a, v, sizeof(a))#define Cpy(a, b) memcpy(a, b, sizeof(a))#define debug(x) cout << #x << ": " << x << endl#define DEBUG(...) fprintf(stderr, __VA_ARGS__)usingnamespace std;
inlineboolchkmin(int &a, int b){return b < a ? a = b, 1 : 0;}
inlineboolchkmax(int &a, int b){return b > a ? a = b, 1 : 0;}
inlineintread(){
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
return x * fh;
}
voidFile(){
#ifdef zjp_shadowfreopen ("2521.in", "r", stdin);
freopen ("2521.out", "w", stdout);
#endif}
constint N = 510, M = 810 * 2, inf = 0x3f3f3f3f;
int n, m, id;
namespace Dinic {
int Head[N], Next[M], to[M], cap[M], e = 1;
inlinevoidadd_edge(int u, int v, int flow){ to[++ e] = v; Next[e] = Head[u]; Head[u] = e; cap[e] = flow; }
inlinevoidAdd(int u, int v, int flow){ add_edge(u, v, flow); add_edge(v, u, flow); }
int S, T, dis[N];
boolBfs(){
queue<int> Q; Set(dis, 0); Q.push(S); dis[S] = 1;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int i = Head[u]; i; i = Next[i]) if (cap[i]) {
int v = to[i]; if (!dis[v]) { dis[v] = dis[u] + 1; if (v == T) returntrue; Q.push(v); }
}
}
returnfalse;
}
int cur[N];
intDfs(int u, int flow){
if (u == T || !flow) return flow;
int res = 0, f;
for (int &i = cur[u]; i; i = Next[i]) if (cap[i]) {
int v = to[i]; if (dis[v] != dis[u] + 1) continue ;
if ((f = Dfs(v, min(flow, cap[i])))) {
cap[i] -= f; cap[i ^ 1] += f;
res += f; if (!(flow -= f)) break;
}
}
if (!flow || !res) dis[u] = 0;
return res;
}
intRun(){
int sum_flow = 0;
while (Bfs()) { Cpy(cur, Head); sum_flow += Dfs(S, inf); }
return sum_flow;
}
}
usingnamespace Dinic;
structEdge { int u, v, w; } lt[M];
intmain(){
File();
n = read(); m = read(); id = read();
For (i, 1, m) {
int u = read(), v = read(), w = read();
lt[i] = (Edge){u, v, w};
}
S = lt[id].u; T = lt[id].v;
For (i, 1, m) if (id != i) {
int res = max(lt[id].w - lt[i].w + 1, 0);
if (res) Add(lt[i].u, lt[i].v, res);
}
printf ("%d\n", Run());
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】