博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU3549:Flow Problem(最大流入门EK)
阅读量:4335 次
发布时间:2019-06-07

本文共 2327 字,大约阅读时间需要 7 分钟。

#include 
#include
#include
#include
#include
#define inf 0x3f3f3f3fusing namespace std;int map[50][50],v[50],pre[1000];int n,m;int bfs(int s,int t){ memset(v,0,sizeof(v)); memset(pre,-1,sizeof(pre)); pre[s]=s; queue
q; q.push(s); v[s]=1; while(!q.empty()) { int tt=q.front(); q.pop(); for(int i=1; i<=n; i++) { if(map[tt][i]&&v[i]==0) { v[i]=1; pre[i]=tt; q.push(i); if(i==t) { return 1; } } } } return 0;}int EK(int s,int t){ int ans=0; while(bfs(s,t)==1) { int min1=inf; for(int i=t; i!=s; i=pre[i]) { if(min1>map[pre[i]][i]) { min1=map[pre[i]][i]; } } for(int i=t; i!=s; i=pre[i]) { map[pre[i]][i]-=min1; map[i][pre[i]]+=min1; } ans+=min1; } return ans;}int main(){ int T,x,y,z; scanf("%d",&T); for(int i=1; i<=T; i++) { scanf("%d%d",&n,&m); memset(map,0,sizeof(map)); while(m--) { scanf("%d%d%d",&x,&y,&z); map[x][y]+=z; } printf("Case %d: %d\n",i,EK(1,n)); EK(1,n); } return 0;}

 #include <iostream>

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <queue>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,tt;
struct node
{
    int x,y,c;
    int next;
}edge[10001];
int head[101],dis[101];
void init()
{
    memset(head,-1,sizeof(head));
    tt=0;
}
void add(int xx,int yy,int zz)
{
    edge[tt].x=xx;
    edge[tt].y=yy;
    edge[tt].c=zz;
    edge[tt].next=head[xx];
    head[xx]=tt++;
    edge[tt].x=yy;
    edge[tt].y=xx;
    edge[tt].c=0;
    edge[tt].next=head[xx];
    head[xx]=tt++;
}
int bfs(int s,int t)
{
     queue<int>q;
     memset(dis,-1,sizeof(dis));
     q.push(s);
     dis[s]=0;
     while(!q.empty())
     {
         int w=q.front();
         q.pop();
         for(int i=head[w];i!=-1;i=edge[i].next)
         {
             if(dis[edge[i].y]==-1&&edge[i].c>0)
             {
                 dis[edge[i].y]=dis[w]+1;
                 q.push(edge[i].y);
             }
         }
     }
    if(dis[t]>=0) return 1;
    return 0;
}
int dinic(int x,int maxt)
{
     int a;
     if(x==n) return maxt;
     for(int i=head[x];i!=-1;i=edge[head[x]].next)
     {
         if(dis[edge[i].y]==x+1&&edge[i].c>0&&(a==min(maxt,edge[i].c)))
         {
             ,mhgr
         }
     }
}
int main()
{
    int T,xx,yy,zz,ans;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        init();
        ans=0;
        scanf("%d%d",&n,&m);
        while(m--)
        {
            scanf("%d%d%d",&xx,&yy,&zz);
            add(xx,yy,zz);
        }
        while(bfs(1,n)==1)
        {
            ans+=dinic(1,inf);
        }
        printf("Case %d: %d\n",i,ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/zhangmingcheng/p/3993589.html

你可能感兴趣的文章
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>
亿级曝光品牌视频的幕后设定
查看>>
ARPA
查看>>
JSP开发模式
查看>>
我的Android进阶之旅------&gt;Android嵌入图像InsetDrawable的使用方法
查看>>
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>
(简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
查看>>
图论知识,博客
查看>>
[原创]一篇无关技术的小日记(仅作暂存)
查看>>
20145303刘俊谦 Exp7 网络欺诈技术防范
查看>>