连通度(定点联通度&&边联通度)

来源:互联网 发布:淘宝德国代购有假货吗 编辑:程序博客网 时间:2024/05/01 20:12

无论是点、边的联通度都是用网络流的方法求解,验证了我的那句话,万物皆网络流

点联通度

用网络流求解 拆点 原网络的点拆成 i i+n <i,i+n>流量1 其他所有边都为oo

Poj 1966

#include<iostream>#include<math.h>#include<algorithm>#include<string.h>#include<stdio.h>using namespace std;#define oo 0x3f3f3f3f#define maxn 108#define maxm 40000struct Edge{int v, f, c, next;}E[maxm];int head[maxn], h[maxn];int stack[maxm];int q[maxn], front, rear, tol;int level[maxn];int n, m;struct Edge2{int u, v;}edge[maxn];bool BFS(int s, int t){memset(level, 0, sizeof level);level[s] = 1;front = rear = 0;q[rear++] = s;while (front < rear){int u = q[front++];if (u == t)return true;for (int i = head[u]; i != -1; i = E[i].next){int v = E[i].v;if (!level[v] && E[i].f>0){level[v] = level[u] + 1;q[rear++] = v;}}}return false;}int Dinic(int s, int t){int maxflow = 0;while (BFS(s, t)){memcpy(h, head, sizeof h);int u = s;int top = 0;while (true){if (u == t){int minflow = oo, flag = 0;for (int i = 0; i < top; i++){if (E[stack[i]].f<minflow){minflow = E[stack[i]].f;flag = i;}}for (int i = 0; i < top; i++){E[stack[i]].f -= minflow;E[stack[i] ^ 1].f += minflow;}top = flag;maxflow += minflow;u = E[stack[top] ^ 1].v;}for (int i = h[u]; i != -1; i = h[u] = E[i].next){int v = E[i].v;if (level[v] == level[u] + 1 && E[i].f){break;}}if (h[u] != -1){stack[top++] = h[u];u = E[h[u]].v;}else{if (top == 0)break;level[u] = 0;u = E[stack[--top] ^ 1].v;}}}return maxflow;}void add_edge(int u, int v, int f){E[tol].v = v;E[tol].f = f;E[tol].c = f;E[tol].next = head[u];head[u] = tol++;E[tol].v = u;E[tol].f = 0;E[tol].c = 0;E[tol].next = head[v];head[v] = tol++;}void Init(){memset(head, -1, sizeof head);tol = 0;}void Build(){Init();for (int i = 0; i < n; i++)add_edge(i, i + n, 1);for (int i = 1; i <= m; i++){int u = edge[i].u;int v = edge[i].v;add_edge(u + n, v, oo);add_edge(v + n, u, oo);}}/*void Back(){for (int i = 0; i < tol; i++)E[i].f = E[i].c;}*/int main(){while (scanf("%d%d", &n, &m) != EOF){for (int i = 1; i <= m; i++){while (getchar() != '(');scanf("%d,%d)", &edge[i].u, &edge[i].v);}int ans = oo;for (int i = 1; i < n; i++){Build();ans = min(ans, Dinic(n,i));//Back();}if (ans >= oo)ans = n;printf("%d\n", ans);}return 0;}

0 0
原创粉丝点击