码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • hdu3549Flow Problem(最大流模板题)


    题目链接:

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3549

    题目大意:

    n个点m条边,找到1到n使得流量最大。

    题目思路:

    最大流模板题,这里用到了Dinic算法,学习传送门--》https://comzyh.com/blog/archives/568/《--

    代码:

    #include 
    using namespace std;  
      
    const int maxn=1000;  
      
    struct node{  
        int u,v,next,c;  
    };  
    node edge[maxn<<1];  
    int head[maxn];  
    int cnt;  
    int dis[maxn];  
    int n,m;//n是边的个数,m是顶点个数 
    int ans; //最大流 
      
      
    void init(){  
        memset(head,-1,sizeof(head));  
        cnt=0;  
        memset(dis,-1,sizeof(dis));  
        ans=0;  
    }  
      
    void add(int a,int b,int c){  //建立邻接表 
        edge[cnt].u=a;  
        edge[cnt].v=b;  
        edge[cnt].c=c;  
        edge[cnt].next=head[a];  
        head[a]=cnt++;  
    }  
      
    int bfs()// 给各点分层,离源点的远近分  
    {  
     memset(dis, -1, sizeof(dis));  
     queue q;  
     dis[1] = 0;  
     q.push(1);  
     int i;  
     int cur;  
     while(!q.empty())  
     {  
      cur = q.front();  
      q.pop();  
      for(i = head[cur]; i != -1; i = edge[i].next)  
      {  
       if(dis[edge[i].v] == -1 && edge[i].c > 0)  
       {  
        dis[edge[i].v] = dis[cur] + 1;  
        q.push(edge[i].v);  
       }  
      }  
     }  
     if(dis[m] < 0)  
      return 0;  
     return 1;  
    }  
      
    int Find(int x,int low){//找增广  
        int a;  
        if(x==m) return low;  
        for(int i=head[x];i!=-1;i=edge[i].next){  
            int v=edge[i].v;  
            if(dis[v]==dis[x]+1 && edge[i].c>0 &&(a=Find(v,min(low,edge[i].c))))  
            {  
                edge[i].c -=a;  
                edge[i^1].c +=a;  
                return a;  
            }  
        }  
        return 0;  
    }  
      
    void dinic(){  
        int temp;  
        while(bfs()){  
    //        printf("%d\n",tmp);  
    //        if(tmp==0) break;  
            temp=Find(1,0x3f3f3f3f);  
             ans+=temp;  
        }  
       // printf("%d\n",ans);  
    }  
      
    int main(){
    int t;cin>>t;
    for(int i=1;i<=t;i++){   
            scanf("%d%d",&m,&n);
            int a,b,flow;  
            init();  
            for(int i=1;i<=n;i++){  
                scanf("%d%d%d",&a,&b,&flow);  //flow是权值。 
                add(a,b,flow);  
                add(b,a,0);  
            }  
            dinic();
            printf("Case %d: %d\n",i,ans);  
        }
    return 0;  
    }  
  • 相关阅读:
    七天.NET 8操作SQLite入门到实战 - 第七天BootstrapBlazor UI组件库引入(1)
    (免费分享)基于springboot财务管理系统
    uniapp 添加定位权限及弹出权限弹框
    灰色关联度分析-详细代码和说明
    百度文心一言API批量多线程写文章软件-key免费无限写
    MES生产管理系统是什么?有ERP系统了为什么还要上
    在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素。
    tuxera ntfs2024破解版mac电脑磁盘读写软件
    appium+jenkins实例构建
    我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
  • 原文地址:https://blog.csdn.net/m0_72495985/article/details/127864027
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号