因特网带宽 Internet Bandwidth
一、题目
给出点数n、源点S、汇点T、边数m,然后给出每条边的起点、终点、和容量,求出最大流。
输入有多组数据,以一个00结尾,每组数据的答案之间有一个空行
二、思路
Dinic算法
三、代码
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define N 205 #define M 10005 using namespace std; int n,m,s,t,tot=1,ans,num; int dep[N],head[N]; struct node{ int next,to,val; }e[M]; inline void addedge(int u,int v,int w){ e[++tot].to=v; e[tot].val=w; e[tot].next=head[u]; head[u]=tot; } inline void add(int u,int v,int w){ addedge(u,v,w); addedge(v,u,w); } inline bool bfs(){ memset(dep,0,sizeof(dep)); queue <int> q; q.push(s); dep[s]=1; int u,v; while(!q.empty()){ u=q.front(); q.pop(); for(int i=head[u];i;i=e[i].next){ v=e[i].to; if(e[i].val && !dep[v]){ dep[v]=dep[u]+1; q.push(v); } } } if(dep[t]) return 1; return 0; } int dfs(int u,int into){ if(u==t) return into; int out=0,res; int v; for(int i=head[u];i;i=e[i].next){ v=e[i].to; if(e[i].val && dep[v]==dep[u]+1){ res=dfs(v,min(e[i].val,into)); e[i].val-=res; e[i^1].val+=res; into-=res; out+=res; } } if(!out) dep[u]=0; return out; }//最大流板子 inline void clear(){ tot=1; ans=0; memset(head,0,sizeof(head)); }//因为是多组数据所以要初始化 int main(){ while(scanf("%d",&n)!=EOF && n){ clear(); scanf("%d%d%d",&s,&t,&m); int u,v,w; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); add(u,v,w); } while(bfs()) ans+=dfs(s,1e9); printf("Network %d\nThe bandwidth is %d.\n\n",++num,ans);//输出的坑 } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了