因特网带宽 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;
}
posted @ 2023-05-17 10:30  ImreW  阅读(5)  评论(0编辑  收藏  举报