費用流(板子)

2021-09-27 08:28:45 字數 2516 閱讀 3833

const int maxn = ;

const int inf = 0x3f3f3f3f;

//path用來儲存找到一條費用最小的增廣路

int path[maxn], dis[maxn], head[maxn], vis[maxn], cnt;

void init()

struct ac edge[maxn];

void addedge(int u, int v, int flow, int cost) ;

head[u] = cnt++;

edge[cnt] = ;

head[v] = cnt++;

}int spfa(int s, int t)

} }

return dis[t] != inf;

} int mcmf(int s, int t, int &cost)

//找到最小流量後,更新該路上的邊的流量

for(int i = path[t]; i != -1; i = path[edge[i ^ 1].v])

maxflow += flow;

} return maxflow; //最大流

}

時間複雜度:可以證明上界為 o( n * m *f ) ,其中 f 表示流量。

const int maxn = ;

const int maxm = ;

const int inf = 0x3f3f3f3f;

int cur[maxn], head[maxn], dis[maxn], cnt;

bool vis[maxn];

int mincost = 0;

struct ac edge[maxm];

int init()

void addedge(int u, int v, int cap, int cost) ;

head[u] = cnt;

edge[++cnt] = ;

head[v] = cnt;

}bool spfa (int s, int t)

} }return dis[t] != inf;

}int dfs(int u, int t, int flow)

} }vis[u] = 0;

return ans;

}int mcmf(int s, int t)

return ans;

}

const int maxn = 500;

const int inf = 0x3f3f3f3f;

int pree[maxn], prev[maxn], dis[maxn], head[maxn], h[maxn], cnt;

bool vis[maxn];

void init()

struct acedge[maxn << 8];

void addedge(int u, int v, int cap, int cost) ;

head[u] = cnt++;

edge[cnt] = ;

head[v] = cnt++;

}int dijkstra(int s, int t)

} }

return dis[t] != inf;

}int mcmf(int s, int t, int &cost)

for (int i = t; i != s; i = prev[i])

cost += flow * h[t]; //每個單位流量都有費用

maxflow += flow;

} return maxflow;

}

const int maxn = ;

const int maxm = ;

const int inf = 0x3f3f3f3f;

int prev[maxn], pree[maxn]; // 前驅節點,和對應邊

int dis[maxn], h[maxn];

struct ac ;

vectorg[maxn << 3];

void init()

void addedge(int u, int v, int cap, int cost) );

g[v].push_back();//-1是因為u剛剛+一條邊

}int dijkstra(int s, int t)

} }return dis[t] != inf;

}int mcmf(int s, int t, int &cost)

for (int i = t; i != s; i = prev[i])

cost += flow * h[t];

maxflow += flow;

//cout << cost << endl;

}return maxflow; // 返回最大流

}

網路流 費用流

這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好bb的 這裡推薦使用zkw演算法求解最小費用流,看著 理解就行,應該還是很好理解的。zkw演算法在稠密圖上跑得飛快,在稀疏圖上還不...

網路流 費用流

網路流有很多種類 其中最大流 有增廣路演算法和預流推進演算法。增廣路演算法就是不斷的新增增廣路。其中的dinic演算法。會稍微提到isap演算法 poj1273 首先想到dfs一直往後延伸,然後從源點到匯點計算每條路,但是這樣只是單條路的最值,有時可能因為走一條路而間接的認定了除這條路以外的某個路通...

費用流模板

const int oo 1e9 無窮 const int mm 11111111 邊 const int mn 888888 點 int node,src,dest,edge int ver mm flow mm cost mm nex mm int head mn dis mn p mn q m...