UVA 10480

来源:互联网 发布:DNS服务的端口号是什么 编辑:程序博客网 时间:2024/06/07 05:06

题意:

网络流:


求最小割,并输出割边

最后一次不能增广后的残图,割边定是容量==流量的点即残图残量为0 的边,将图中的点分为 两部分,一部分为 原点能到达的点,量一部分为不能到达的点

如果 u  可以到达而 v  不可到达,且 u  --v  之间本来就有一条边则该边为割边大笑


#include<iostream>#include<queue>#include<string.h>#include<stdio.h>using namespace std;const int maxn = 555;int flow[maxn][maxn];int g[maxn][maxn];int path1[maxn];int path2[maxn];int x[maxn];int y[maxn];int vis[maxn];const int inf =0x3f3f3f3f;struct edge{    int to ,cap,rev,flow;};vector<edge>v[maxn];void add_edge(int from,int to ,int cap){    v[from].push_back((edge)    {        to,cap,v[to].size(),0    });    v[to].push_back((edge)    {        from,cap,v[from].size()-1,0    });}//EK 算法void maxflow(int s,int t){    int max_flow = 0;    queue<int>q;    while(1)    {        memset(vis,0,sizeof(vis));        q.push(s);        vis[s] = inf;        while(!q.empty())        {            int u = q.front();            q.pop();            //if(u==t) break;//求最大流时需加上此句 ,本题不能加            for(int i  = 0; i<v[u].size(); i++)            {                edge e = v[u][i];                if(e.cap>e.flow&&!vis[e.to])                {                    path1[e.to] = u;//记录前驱                    path2[e.to] = i;//记录是前驱的第几条边                    vis[e.to] = min(vis[u],e.cap-e.flow);                    q.push(e.to);                }            }        }        if(vis[t]==0)            break;        for(int i = t; i!=s; i=path1[i])        {            v[path1[i]][path2[i]].flow+=vis[t];            edge e = v[path1[i]][path2[i]];            v[e.to][e.rev].flow-=vis[t];        }    }}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i = 1; i<=n; i++)            v[i].clear();        int tcap ;        for(int i = 1; i<=m; i++)        {            scanf("%d%d",&x[i],&y[i]);            scanf("%d",&tcap);            add_edge(x[i],y[i],tcap);        }        maxflow(1,2);//输出割边        for(int i  = 1; i<=m; i++)        {            if((!vis[x[i]]&&vis[y[i]])||(!vis[y[i]]&&vis[x[i]]))            {                printf("%d %d\n",x[i],y[i]);            }        }        printf("\n");    }}


0 0
原创粉丝点击