初次接触,https://www.cnblogs.com/liu-runda/p/6262832.html,通过这个博客学习的建图方式。建好图后套板子即可。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300;
const int INF = 0x7fffffff;
struct edge
{
edge(){}
edge(int _to, int _cap, int _rev, int _id)
:to(_to),cap(_cap),rev(_rev),id(_id){}
int to,cap,rev,id;
};
vector<edge> G[MAXN];
int level[MAXN];
int iter[MAXN];
void addedge(int from, int to, int cap, int id)
{
G[from].push_back(edge(to, cap, G[to].size(), 0));
G[to].push_back(edge(from, 0, G[from].size()-1, id));
}
//先分层,然后在分层图上dfs
void bfs(int s)
{
memset(level, -1, sizeof(level));
queue<int> que;
level[s] = 0;
que.push(s);
while(!que.empty())
{
int v = que.front();
que.pop();
for(int i = 0; i < G[v].size(); ++i)
{
edge& e = G[v][i];
if(e.cap > 0 && level[e.to] < 0)
{
level[e.to] = level[v] + 1;
que.push(e.to);
}
}
}
}
int dfs(int v, int t, int f)
{
if(v == t) return f;
for(int &i = iter[v]; i < G[v].size(); ++i)
{
edge &e = G[v][i];
if(e.cap > 0 && level[v] < level[e.to])
{
int d = dfs(e.to, t, min(f, e.cap));
if(d > 0)
{
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
int maxFlow(int s, int t)
{
int flow = 0;
while(true)
{
bfs(s);
if(level[t] < 0) return flow;
memset(iter,0,sizeof(iter));
int f;
while((f = dfs(s,t,INF)) > 0)
flow += f;
}
}
int low[100000];
int totFlow[MAXN];
int res[100000];
int main()
{
int T,n,m,u,v,s,t,up;
scanf("%d",&T);
while(T--)
{
memset(totFlow,0,sizeof(totFlow));
memset(res,0,sizeof(res));
scanf("%d %d",&n,&m);
s = 0, t = n+1;
for(int i = 1; i <= m; ++i)
{
scanf("%d %d %d %d",&u,&v,&low[i],&up);
addedge(u,v,up-low[i],i);
totFlow[u] -= low[i];
totFlow[v] += low[i];
}
int sum = 0;
for(int i = 1; i <= n; ++i)
{
if(totFlow[i] < 0)
addedge(i,t,-totFlow[i],0);
else
{
sum += totFlow[i];
addedge(s,i,totFlow[i],0);
}
}
if(maxFlow(s,t) == sum)
{
puts("YES");
for(int u = 1; u <= n; ++u)
{
for(int i = 0; i < G[u].size(); ++i)
{
int v = G[u][i].to;
if(v == t) continue;
if(G[u][i].id)
res[G[u][i].id] += (low[G[u][i].id] + G[u][i].cap);
}
}
for(int i = 1; i <= m; ++i)
printf("%d\n",res[i]);
}
else
puts("NO");
for(int i = 0; i <= n+1; ++i)
G[i].clear();
}
return 0;
}