最大流poj1273

裸题:注意边可能重复;

代码如下:

#include<stdio.h>
#include<string.h>
#include<queue>
#define maxn 202
int map[maxn][maxn];
int vis[maxn];
int pre[maxn];
bool bfs(int n)
{
    memset(vis,0,sizeof(vis));
    std::queue<int>q;
    q.push(1);
    vis[1]=0;
    while(!q.empty())
    {
        int x=q.front(); q.pop();
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&map[x][i])
            {
                vis[i]=1;
                pre[i]=x;
                if(i==n) return true;
                q.push(i);
            }
        }
    }
    return false;
}
int EK(int n)
{
    int ret=0;
    while(bfs(n))
    {
        int i=n,max=0x7fffffff;
        while(i!=1)
        {
            if(max>map[pre[i]][i]) max=map[pre[i]][i];
            i=pre[i];
        }
        i=n;
        while(i!=1)
        {
            map[pre[i]][i]-=max;
            map[i][pre[i]]+=max;
            i=pre[i];
        }
        ret+=max;
    }
    return ret;
}
int main()
{
    //freopen("Input.txt","r",stdin);
    int ncase,n;
    while(~scanf("%d%d",&ncase,&n))
    {
        int a,b,val;
        memset(map,0,sizeof(map));
        while(ncase--)
        {
            scanf("%d%d%d",&a,&b,&val);
            map[a][b]+=val;
        }
        int ret=EK(n);
        printf("%d\n",ret);
    }
}

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
#define maxn 202
int map[maxn][maxn];
int h[maxn];
int bfs(int n)
{
    int u,i;
    memset(h,0,sizeof(h));
    queue<int>q;
    q.push(1);
    h[1]=1;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(i=1;i<=n;i++)
            if(!h[i]&&map[u][i])
            {
                h[i]=h[u]+1;
                q.push(i);
            }
    }
    return h[n]!=0;
}
int MIN(int a,int b) { return a>b?b:a;}
int dfs(int n,int u,int ff)
{
    int i,z;
    int tt=ff;
    if(u==n) return ff;
    for(i=1;i<=n&&tt;i++)
       if(h[i]==h[u]+1&&map[u][i]>0)
       {
           z=dfs(n,i,MIN(tt,map[u][i]));
           map[u][i]-=z;
           map[i][u]+=z;
           tt-=z;
       }
    return ff-tt;
}
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        int a,b,c;
        memset(map,0,sizeof(map));
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]+=c;
        }
        int ret=0;
        while(bfs(n))
          ret+=dfs(n,1,0x7fffffff);
        printf("%d\n",ret);
    }
    return 0;
}

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define INF 0x7fffffff
#define maxn 205
struct Edge
{
       int v,f,next;
}e[2*maxn];
bool visit[maxn];
int level[maxn],head[maxn];
int s=1,t,size;
bool BFS()
{
     memset(visit,0,sizeof(visit));
     memset(level,0,sizeof(level));
     int v,i;
     queue<int>q;
     q.push(s);
     level[s]=1;
     while(!q.empty())
     {
            int u=q.front();q.pop();
            if(u==t) return true;
            for(i=head[u]; i!=-1; i=e[i].next)
            {
                 v=e[i].v;
                 if(!level[v]&&e[i].f)
                 {
                     level[v]=level[u]+1;
                     q.push(v);
                 }
            }
     }
    return false;
}
void AddEdge(int a,int b,int c)
{
     e[size].v=b;
     e[size].f=c;
     e[size].next=head[a];
     head[a]=size++;
}
int DFS(int u,int mimf)
{
    if(u==t) return mimf;
    int ret,f,i;
    ret=0;
    for(i=head[u];i!=-1;i=e[i].next)
    {
         if( e[i].f&&level[e[i].v]==level[u]+1)
         {
             f=DFS(e[i].v,min(mimf-ret,e[i].f));
             e[i].f-=f;
             e[i^1].f+=f;
             ret+=f;
             if( mimf==ret) return ret;
         }
    }
    return ret;
}
int main()
{
    int n,m,a,b,c,ret;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
           size=0;
           s=1; t=n;
           memset(e,0,sizeof(e));
           memset(head,-1,sizeof(head));
           while( m--)
           {
                  scanf("%d%d%d",&a,&b,&c);
                  AddEdge(a,b,c);
                  AddEdge(b,a,0);
           }
           ret=0;
           while(BFS())
           {
                ret+=DFS(s,INF);
           }
           printf("%d\n",ret);
    }
    return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值