hdu 1532

来源:互联网 发布:可视化软件 编辑:程序博客网 时间:2024/05/22 08:26
心情不爽找到水题刷刷,很裸的网络流!直接模版过!!!!
#include <stdio.h>#include <string.h>#include<iostream>using namespace std;const int VM = 220, EM = 20500, INF = 0x3f3f3f3f;struct E{    int to, frm, nxt, cap;}edge[EM];int head[VM], e, n, src, des;int dep[VM], gap[VM]; //gap[x]=y:说明残留网络中dep[i]=x的个数为y//dep记录到汇点的距离,gap[i]记录到汇点的距离为i的个数void addedge(int u, int v, int c){    edge[e].frm = u;    edge[e].to = v;    edge[e].cap = c;    edge[e].nxt = head[u];    head[u] = e++;    edge[e].frm = v;    edge[e].to = u;    edge[e].cap = 0;    edge[e].nxt = head[v];    head[v] = e++;}void BFS(int src, int des){    memset(dep, -1, sizeof(dep));    memset(gap, 0, sizeof(gap));    gap[0] = 1;   //说明此时有1个dep[i] = 0    int Q[VM], front = 0, rear = 0;    dep[des] = 0;    Q[rear++] = des;    int u, v;    while (front != rear)    {        u = Q[front++];        front = front%VM;        for (int i=head[u]; i!=-1; i=edge[i].nxt)        {            v = edge[i].to;            if (edge[i].cap != 0 || dep[v] != -1)                continue;            Q[rear++] = v;            rear = rear % VM;            ++gap[dep[v] = dep[u] + 1];  //求出各层次的数量        }    }}int SAP(int src, int des){    int res = 0;    BFS(src, des);    int cur[VM];    int S[VM], top = 0;    memcpy(cur, head, sizeof(head));    int u = src, i;    while (dep[src] < n)   //n为结点的个数    {        if (u == des)        {            int temp = INF, inser = n;            for (i=0; i!=top; ++i)                if (temp > edge[S[i]].cap)                {                    temp = edge[S[i]].cap;                    inser = i;                }            for (i=0; i!=top; ++i)            {                edge[S[i]].cap -= temp;                edge[S[i]^1].cap += temp;            }            res += temp;            top = inser;            u = edge[S[top]].frm;        }        if (u != des && gap[dep[u] -1] == 0)//出现断层,无增广路            break;        for (i = cur[u]; i != -1; i = edge[i].nxt)//遍历与u相连的未遍历结点            if (edge[i].cap != 0 && dep[u] == dep[edge[i].to] + 1) //层序关系, 找到允许                break;        if (i != -1)//找到允许弧        {            cur[u] = i;            S[top++] = i;//加入路径栈            u = edge[i].to;//查找下一个结点        }        else   //无允许的路径,修改标号当前点的标号比与之相连的点中最小的多1        {            int min = n;            for (i = head[u]; i != -1; i = edge[i].nxt) //找到与u相连的v中dep[v]最小的点            {                if (edge[i].cap == 0)                    continue;                if (min > dep[edge[i].to])                {                    min = dep[edge[i].to];                    cur[u] = i;          //最小标号就是最新的允许弧                }            }            --gap[dep[u]];          //dep[u] 的个数变化了 所以修改gap            ++gap[dep[u] = min + 1]; //将dep[u]设为min(dep[v]) + 1, 同时修改相应的gap[]            if (u != src) //该点非源点&&以u开始的允许弧不存在,退点                u = edge[S[--top]].frm;        }    }    return res;}int main(){    int m,num;    while (scanf("%d%d", &m,&n) != EOF)    {        e = 0;        memset(head, -1, sizeof(head));        int u, v, c, src =1, des =n;        int temp=n;        for(int i=0;i<m;i++)        {            cin>>u>>v>>c;            addedge(u,v,c);        }        printf("%d\n", SAP(src, des));    }    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子不听话把我胃气疼了怎么办 因为孩子不听话夫妻经常吵架怎么办 11岁儿子不听话了怎么办 二十岁的儿子还不听话怎么办 幼儿园小班幼儿不听老师的话怎么办 幼师对待不听话的孩子该怎么办 2岁宝宝不吃饭只喝奶怎么办 孩子哭着喊妈妈不睡觉怎么办 孩子晚上不睡觉一直哭怎么办 孩子不睡觉还哭怎么办 孩子晚上不睡觉老哭怎么办? 4岁宝宝叛逆期怎么办 驾考紧张脚抖怎么办 驾考科目三紧张怎么办 孩子不自信容易紧张怎么办 在人多时候紧张怎么办 考科目二很紧张怎么办 明天出成绩很紧张怎么办 一紧张就射精了怎么办 孩子在幼儿园表现不好怎么办 小孩子在幼儿园表现的不好怎么办 学籍档案写错了怎么办 发展报告填错了怎么办 学生发展报告丢了怎么办 大一新生入学团员档案袋丢失怎么办 三年级孩子语文成绩差怎么办 运气不好时 我们该怎么办 猫走了财运变差怎么办 特别在意别人的眼光怎么办 入职两个月没有业绩怎么办 在学舞蹈中孩子怕疼怎么办 我生二胎怕疼怎么办 孩子的执行力差怎么办 怀孕三个月不想要孩子怎么办 生完孩子老是掉头发怎么办 5岁半宝宝有狐臭怎么办? 4岁宝宝脾气倔怎么办 小孩子摔到后脑勺吐了怎么办 学生报告册丢了怎么办 错过宝宝语言敏感期怎么办 父亲骂我很难听怎么办