#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...