HDU 6214 Smallest Minimum Cut

来源:互联网 发布:淘宝客服发的红包 编辑:程序博客网 时间:2024/05/22 14:17

这个题就是求包含最少边数的最小割。比赛的时候想到的是把第一次最大流跑出来的割边集流量置1,其余的无穷大,然后再跑一次最大流,发现一直wa。
然后网上原来还有另外一种方法,那就是初始流量先乘上一个比边数大的数,然后加一,然后跑一次最大流,最后对乘上的这个数取模,得出来的就是答案。

#include <bits/stdc++.h>using namespace std;const int MAXN = 200+5;const int inf = 1e9;const int mod = 1024;int n,m;int s,e;struct node{    int u,v,f,next;} edge[2005],edge1[2005];int head[MAXN];int cnt;void add(int u,int v,int f){    edge[cnt].u = u;    edge[cnt].v = v;    edge[cnt].f = f;    edge[cnt].next = head[u];    head[u] = cnt++;    edge[cnt].u = v;    edge[cnt].v = u;    edge[cnt].f = 0;    edge[cnt].next = head[v];    head[v] = cnt++;}int dis[MAXN];int bfs(int s,int t){    int u,v;    memset(dis,-1,sizeof dis);    dis[s] = 0;    queue<int>q;    q.push(s);    while(!q.empty())    {        u = q.front();        q.pop();        for(int i = head[u]; i != -1; i = edge[i].next)        {            v = edge[i].v;            if(dis[v] == -1 && edge[i].f)            {                dis[v] = dis[u] + 1;                q.push(v);            }        }    }    if(dis[t] > 0)return 1;    return 0;}int dfs(int s,int t,int min1){    if(s == t)return min1;    int flow,ans = 0;    for(int i = head[s]; i != -1; i = edge[i].next)    {        int v = edge[i].v;        if(dis[v] == dis[s] + 1 && edge[i].f && (flow = dfs(v,t,min(min1,edge[i].f))))        {            edge[i].f -= flow;            edge[i^1].f += flow;            ans += flow;            min1 -= flow;            if(!min1)break;        }    }    if(ans)return ans;    dis[s] = -1;    return 0;}int get_maxflow(int s,int e){    int max_flow = 0,flow;    while(bfs(s,e))    {        while((flow = dfs(s,e,inf))>0)        {            max_flow += flow;        }    }    return max_flow;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        scanf("%d%d",&s,&e);        cnt = 0;        for(int i = 1; i <= n; ++i)head[i] = -1;        int u,v,f;        while(m--)        {            scanf("%d%d%d",&u,&v,&f);            f *= mod;            f++;            add(u,v,f);        }        printf("%d\n",get_maxflow(s,e)%mod);    }    return 0;}