2021-team16-dinic
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
#pragma GCC optimize("Ofast")
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define ld long double
#define For(i,x,y) for(ll i=(x);i<=(y);++i)
#define FOr(i,x,y) for(ll i=(x);i>=(y);--i)
#define rep(i,x,y) for(ll i=(x);i<(y);++i)
#define clr(a,v) memset(a,v,sizeof(a))
#define cpy(a,b) memcpy(a,b,sizeof(a))
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define pa pair<ll,ll>
#define y1 y11111111111111
#define debug puts("@@@@@@@@@@@@@@@@@@@@@@@")
ll read(){
ll x=0,f=1; char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
}
void write(ll x){
if (x<0) putchar('-'),write(-x);
else{
if (x>=10) write(x/10);
putchar(x%10+'0');
}
}
const ll N = 1010;
const ll M = 10010;
struct Edge
{
ll v,c,ne,cost;
}e[M<<1];
ll tot,sink,source,mincost;
ll num[N],x[N];
ll he[N],dep[N];
inline void add(ll u, ll v, ll c, ll cost)
{
e[tot].v = v; e[tot].c = c;
e[tot].cost = cost; e[tot].ne = he[u];he[u] = tot++;
}
inline void addedge(ll u, ll v, ll c, ll cost)
{
add(u,v,c,cost); add(v,u,0,-cost);
}
const ll inf = 0x3f3f3f3f;
ll dis[N],pre[N];
bool vis[N];
inline bool spfa()
{
queue<ll>q;
memset(dis,63,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[source] = 0;
q.push(source);
while (!q.empty())
{
ll cur = q.front(); q.pop();
vis[cur] = 0;
for(ll i = he[cur]; i != -1; i = e[i].ne)
{
ll to = e[i].v;
if (e[i].c > 0 && dis[to]>dis[cur]+e[i].cost)
{
dis[to] = dis[cur] + e[i].cost;
if (!vis[to]) {vis[to] = 1; q.push(to);}
}
}
}
return dis[sink] != inf;
}
inline ll dfs(ll u, ll delta)
{
if (u == sink) return delta;
vis[u] = 1;
ll flow = 0;
for(ll i = he[u]; i != -1; i = e[i].ne)
{
ll to = e[i].v;
if (!vis[to] && e[i].c > 0 && dis[to] == dis[u] + e[i].cost)
{
ll tmp = dfs(to,min(delta-flow,e[i].c));
if (tmp)
{
mincost += e[i].cost * tmp;
e[i].c -= tmp; e[i^1].c += tmp;
flow += tmp;
}
if(delta==flow)break;//切记不加就被卡到指数级了
}
}
vis[u] = 0;
return flow;
}
inline ll dinic()
{
ll maxflow = 0;
while (spfa())
{
while (1)
{
ll tmp = dfs(source,inf);
if (!tmp) break;
maxflow += tmp;
}
}
return maxflow;
}
int main()
{
}
/*在edit page界面的代码是正常的*/
#pragma GCC optimize("Ofast")
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include
using namespace std;
#define ll int
#define ld long double
#define For(i,x,y) for(ll i=(x);i<=(y);++i)
#define FOr(i,x,y) for(ll i=(x);i>=(y);--i)
#define rep(i,x,y) for(ll i=(x);i<(y);++i)
#define clr(a,v) memset(a,v,sizeof(a))
#define cpy(a,b) memcpy(a,b,sizeof(a))
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define pa pair
#define y1 y11111111111111
#define debug puts("@@@@@@@@@@@@@@@@@@@@@@@")
ll read(){
ll x=0,f=1; char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
}
void write(ll x){
if (x<0) putchar('-'),write(-x);
else{
if (x>=10) write(x/10);
putchar(x%10+'0');
}
}
const ll N = 1010;
const ll M = 10010;
struct Edge
{
ll v,c,ne,cost;
}e[M<<1];
ll tot,sink,source,mincost;
ll num[N],x[N];
ll he[N],dep[N];
inline void add(ll u, ll v, ll c, ll cost)
{
e[tot].v = v; e[tot].c = c;
e[tot].cost = cost; e[tot].ne = he[u];he[u] = tot++;
}
inline void addedge(ll u, ll v, ll c, ll cost)
{
add(u,v,c,cost); add(v,u,0,-cost);
}
const ll inf = 0x3f3f3f3f;
ll dis[N],pre[N];
bool vis[N];
inline bool spfa()
{
queue
memset(dis,63,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[source] = 0;
q.push(source);
while (!q.empty())
{
ll cur = q.front(); q.pop();
vis[cur] = 0;
for(ll i = he[cur]; i != -1; i = e[i].ne)
{
ll to = e[i].v;
if (e[i].c > 0 && dis[to]>dis[cur]+e[i].cost)
{
dis[to] = dis[cur] + e[i].cost;
if (!vis[to]) {vis[to] = 1; q.push(to);}
}
}
}
return dis[sink] != inf;
}
inline ll dfs(ll u, ll delta)
{
if (u == sink) return delta;
vis[u] = 1;
ll flow = 0;
for(ll i = he[u]; i != -1; i = e[i].ne)
{
ll to = e[i].v;
if (!vis[to] && e[i].c > 0 && dis[to] == dis[u] + e[i].cost)
{
ll tmp = dfs(to,min(delta-flow,e[i].c));
if (tmp)
{
mincost += e[i].cost * tmp;
e[i].c -= tmp; e[i^1].c += tmp;
flow += tmp;
}
if(delta==flow)break;//切记不加就被卡到指数级了
}
}
vis[u] = 0;
return flow;
}
inline ll dinic()
{
ll maxflow = 0;
while (spfa())
{
while (1)
{
ll tmp = dfs(source,inf);
if (!tmp) break;
maxflow += tmp;
}
}
return maxflow;
}
int main()
{
}
/*在edit page界面的代码是正常的*/