poj 3469 isap演算法求最大流

2021-08-25 17:58:12 字數 1711 閱讀 9397

#include #include #define debug

#ifdef debug

#define debug(...) printf( __va_args__)

#else

#define debug(...)

#endif

#define n 20010

#define m 1800000

#define max_int 0x3fffffff

#define min(a, b) (a) < (b) ? (a) : (b)

/* 圖的鄰接表+靜態鍊錶表示法 */

struct edge;

struct edge edge[m];

int head[n]; /* head[u]表示頂點u第一條鄰接邊的序號, 若head[u] = -1, u沒有鄰接邊 */

int n;

int current; /* 當前有多少條邊 */

void add_edge(int u, int v, int weight)

*/ /* 新增正向邊u->v */

edge[current].u = u;

edge[current].v = v;

edge[current].weight = weight;

edge[current].next = head[u];

head[u] = current++;

/* 新增反向邊v->u */

edge[current].u = v;

edge[current].v = u;

edge[current].weight = 0;

edge[current].next = head[v];

head[v] = current++;

}int isap(int s, int e)

max_flow = 0;

augment[s] = max_int;

parent[s] = -1;

u = s;

while (level[s] < n)

debug("\n");

} /* 從頂點u往下找鄰接點 */

for (i = curedge[u]; i != -1; i = edge[i].next)

} if (i == -1)

curedge[u] = head[u]; /* 頂點u的所有邊都試過了,沒有出路, 更新了u的level後, 又從第一條邊開始找 */

//找出level最小的鄰接點

min_lev = n;

for (i = head[u]; i != -1; i = edge[i].next)

}level[u] = min_lev + 1;

count[level[u]]++;

debug("頂點%d的level= %d\n", u, level[u]);

debug("頂點%d走不通, 回到%d\n", u, edge[curedge[u]].u);

if (u != s ) u = parent[u]; /* 回退到上乙個頂點 */

} }return max_flow;

}int main()

while (m--)

n += 2;

printf("%d\n", isap(0, n-1));

} return 0;

}

poj 3469 最大流 最小割 SAP演算法模板

題目 題意 有雙核處理器,有n個任務,給出每個任務在分別在兩個處理核心上工作的花費,然後有m行,每行給出兩個任務,如果兩個任務不在同乙個處理核心上工作,那麼將有額外的花費。求最小花費 思路 最小割。之前用dinic演算法做的,加上當前弧優化6000ms。省賽的時候yjj看到我的最大流板子是 dini...

RMQ 求區間最值(poj 3264)

1.概述 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j之間的最小 大值。這兩個問題是在實際應用中經常遇到的問題,下面介紹一下解決這兩種問題的比較高效的演算法...

演算法儲備之Dijkstra演算法求單源點最短路徑

迪傑斯特拉演算法求單元點最短路徑,圖的儲存結構為鄰接矩陣 在找最短距離和更新距離時都用for迴圈遍歷結點數 時間複雜度為o v include include include define v 9 int mindistance int dist,bool sptset return min ind...