UVA10480 打印最大流割掉了哪条边..

来源:互联网 发布:帝王三国辅助软件 编辑:程序博客网 时间:2024/04/28 01:34

记录一下新的板子

#include<iostream>  #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<math.h>  #include<vector>  #include<queue>  #include<map>  #include<set>  #include<string>  #include<bitset>  #include<algorithm>  using namespace std;#define inf 99999999  #define maxn 400  //最大点的个数  #define maxm 400005 //最大边的个数  #define INF 1<<30  int gra[60][60];struct Edge{    int to, next, cap, flow, from;    Edge() {}    Edge(int from, int to, int next, int cap, int flow) :from(from), to(to), next(next), cap(cap), flow(flow) {}}edge[maxm];int vs, vt, VN;int tot;int first[maxn];int gap[maxn], dep[maxn], cur[maxn];void init(){    tot = 0;    memset(first, -1, sizeof(first));}void addedge(int u, int v, int w){    edge[tot] = Edge(u, v, first[u], w, 0);    first[u] = tot++;    edge[tot] = Edge(v, u, first[v], 0, 0);    first[v] = tot++;}int q[maxn];void bfs(int vt){    memset(dep, -1, sizeof(dep));    memset(gap, 0, sizeof(gap));    gap[0] = 1;    int front = 0, rear = 0;    dep[vt] = 0;    q[rear++] = vt;    while (front != rear) {        int u = q[front++];        for (int i = first[u]; i != -1; i = edge[i].next) {            int v = edge[i].to;            if (dep[v] != -1)continue;            q[rear++] = v;            dep[v] = dep[u] + 1;            gap[dep[v]]++;        }    }}int S[maxn];int sap(int vs, int vt, int VN) //VN表示总的点数,vs表示起点,vt表示终点  {    bfs(vt);    memcpy(cur, first, sizeof(first));    int top = 0, u = vs, ans = 0;    while (dep[vs]<VN) {        if (u == vt) {            int Min = INF, inser;            for (int i = 0; i<top; i++) {                if (Min>edge[S[i]].cap - edge[S[i]].flow) {                    Min = edge[S[i]].cap - edge[S[i]].flow;                    inser = i;                }            }            for (int i = 0; i<top; i++) {                edge[S[i]].flow += Min;                edge[S[i] ^ 1].flow -= Min;                //edge[S[i]].cap-=Min;                  //edge[S[i]^1].cap+=Min;              }            ans += Min;            top = inser;            u = edge[S[top] ^ 1].to;            continue;        }        bool flag = false;        int v;        for (int i = cur[u]; i != -1; i = edge[i].next) {            v = edge[i].to;            if (edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u]) {                flag = true; cur[u] = i; break;            }        }        if (flag) {            S[top++] = cur[u]; u = v; continue;        }        int Min = VN;        for (int i = first[u]; i != -1; i = edge[i].next) {            if (edge[i].cap - edge[i].flow && dep[edge[i].to]<Min) {                Min = dep[edge[i].to];                cur[u] = i;            }        }        gap[dep[u]]--;        if (!gap[dep[u]])return ans;        dep[u] = Min + 1;        gap[dep[u]]++;        if (u != vs)u = edge[S[--top] ^ 1].to;    }    return ans;}int vis[100];void bfs(){    memset(vis, 0, sizeof(vis));    vis[vs] = 1;    int front, rear;    front = 1; rear = 1;    q[rear] = vs;    int x, v, i;    while (front <= rear) {        x = q[front];        front++;        for (i = first[x]; i != -1; i = edge[i].next) {            v = edge[i].to;            if (vis[v])continue;            if (edge[i].cap && edge[i].cap>edge[i].flow) {                rear++;                q[rear] = v;                vis[v] = 1;            }        }    }    memset(gra, 0, sizeof(gra));  //gra保存的是答案      for (i = 1; i <= tot; i++) {        int u = edge[i].from;        int v = edge[i].to;        if (u>v)swap(u, v);        if ((vis[u] && !vis[v]) || (!vis[u] && vis[v])) {            gra[u][v] = gra[v][u] = 1;        }    }}int main(){    int n, m, i, j, c, d, f, u, v;    while (cin>>n>>m)    {        if (n == 0 && m == 0)break;        init();        VN = n, vs = 1, vt = 2;        for (i = 1; i <= m; i++) {            scanf("%d%d%d", &c, &d, &f);            addedge(c, d, f);            addedge(d, c, f);        }        sap(1,2,n);        bfs();        for (i = 1; i <= n; i++) {            for (j = i + 1; j <= n; j++) {                if (gra[i][j]) {                    printf("%d %d\n", i, j);                }            }        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击