cdoj 1143 传输数据 最大流

传输数据

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/1143

Description

机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,现在需要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内最多传送多少数据?

Input

第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200)。N网线的数量,M是电脑的数量。

第二行到第N+1行: 每行有三个整数,Si,Ei 和 Ci。Si 和 Ei (1≤Si,Ei≤M) 指明电脑编号,数据从 Si 流向 Ei。Ci(0≤Ci≤10,000,000)是这条网线的最大容量。

Output

输出一个整数,即排水的最大流量。

Sample Input

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

Sample Output

50

HINT

题意

题解:

最大流裸题

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 10000
#define eps 1e-9
const int inf=0x7fffffff;   //无限大
//**************************************************************************************

struct edge
{
    int to,cap,rev;
};
vector<edge> g[maxn];
int level[maxn];
int iter[maxn];
void add_edge(int from,int to,int cap)
{
    g[from].push_back((edge){to,cap,g[to].size()});
    g[to].push_back((edge){from,0,g[from].size()-1});
}
void bfs(int s)
{
    memset(level,-1,sizeof(level));
    queue<int> que;
    level[s]=0;
    que.push(s);
    while(!que.empty())
    {
        int v=que.front();
        que.pop();
        for(int i=0;i<g[v].size();i++)
        {
            edge &e=g[v][i];
            if(e.cap>0&&level[e.to]<0)
            {
                level[e.to]=level[v]+1;
                que.push(e.to);
            }
        }
    }
}
int dfs(int v,int t,int f)
{
    if(v==t)return f;
    for(int &i=iter[v];i<g[v].size();i++)
    {
        edge &e=g[v][i];
        if(e.cap>0&&level[v]<level[e.to])
        {
            int d=dfs(e.to,t,min(f,e.cap));
            if(d>0)
            {
                e.cap-=d;
                g[e.to][e.rev].cap+=d;
                return d;
            }
        }
    }
    return 0;
}
int max_flow(int s,int t)
{
    int flow=0;
    while(1)
    {
        bfs(s);
        if(level[t]<0)return flow;
        memset(iter,0,sizeof(iter));
        int f;
        while((f=dfs(s,t,inf))>0)
            flow+=f;
    }
}

int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        for(int i=0;i<=m;i++)
            g[i].clear();
        int a,b,c;
        for(int i=0;i<n;i++)
        {
            cin>>a>>b>>c;
            add_edge(a,b,c);
        }
        cout<<max_flow(1,m)<<endl;
    }
}
时间: 2024-10-12 17:01:21

cdoj 1143 传输数据 最大流的相关文章

《算法问题实战策略》-chaper32-网络流

基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓“网络流”,其模型是非常有现实意义的.我们将该图视为计算机网络结构.此图中,s称其为源点而t称其为汇点.这个图中剩余的源泉代表网络设备,连接个顶点的边线表示连接两个设备的数据线缆,边的权值表示这条线缆能够传输的最大数据. 首先我们应该能够注意到,有向路径<s,t>就是一条传输路线,而这条传输数据的

java 中的I/O流

I/O 流的三种分类 流的方向 输入/输出 数据单位 字节/字符 字符流专用于处理文本 字节流用于处理一切数据 流的功能 节点/过滤 节点:真正传输数据 过滤流:为节点流增强功能 1.创建节点流 2.封装过滤流 3.读/写数据 4.关闭最外层的过滤流 字节流 InputStream/OutputStream 字节流的父类 抽象类 FileInputStream/FileOutputStream 节点流 读写文件 write(int a) 写一个字节 write(byte[] bs) 把bs中所有

Java-IO流篇《六》

1. java.io.File类 File类代表系统文件(文件和目录),磁盘上的文件和目录在Java程序中是用File类的实例来表示. 常用的构造方法:File (String pathname);File(File parent, String child) ;File(String parent,String child) 以pathname为路径创建File对象,如果pathname是相对路径,则是相对于Java的 系统属性user.dir中的路径(即当前字节码运行的目录). File类的

Java-IO流篇

1. java.io.File类 File类代表系统文件(文件和目录),磁盘上的文件和目录在Java程序中是用File类的实例来表示. 常用的构造方法:File (String pathname);File(File parent, String child) ;File(String parent,String child) 以pathname为路径创建File对象,如果pathname是相对路径,则是相对于Java的 系统属性user.dir中的路径(即当前字节码运行的目录). File类的

Java学习总结(7)——(File类,IO流,(缓冲流,转换流等),Properties类)

一.File类 java.io.File类代表系统文件(文件和目录) 访问文件属性步骤 (1)创建文件对象 格式:File file=new File(String pathname); (2)调用方法:操作文件目录的属性(路径,权限,日期和时间等) File类的属性(separator默认名称分隔符) (1)在UNIX系统上,此字段的值为 '/ ';在window系统上,它为'\' (2)为了程序的跨平台性,文件的路径应该用这个属性值来代表 File类的常用方法 方法名称 说明 Boolean

理解Java之IO流

流是一种抽象概念,它代表了数据的无结构化传递.用来进行输入输出操作的流就称为IO流. IO流结构 流的分类方式 按流向分:从文件/网络/内存等(数据源)到程序是输入流 从程序到文件/网络/内存等(数据源)是输出流 按数据处理单位分 字节流:以字节为单位传输数据的流,以Stream结尾的都是字节流. 字符流:以字符为单位传输数据的流,以Reader结尾的都是输入字符流,以Writer结尾的都是输出字符流. 按功能(层次)分 节点流:用于直接操作目标设备的流 处理流(也叫过滤流):是对一个已存在的流

Java I/O 学习总结(一)

先来看一张有关Java I/O 的图片(不要慌) 这张图片想必大家也都见过很多次,很详细的将Java I/O 相关的内容罗列了出来,暂且不要被吓到,我们边学边总结,最后回过头再来看这张图片,会有不一样的感受. Java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入. 流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络

【网络原理】期末复习笔记 第二章 物理层

第二章 物理层 2.1物理层的基本概念 物理层定义:解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是具体的传输媒体. 物理层的主要任务为:确定与传输媒体的接口的特性 机械特性:接口形状,大小,引线数目 功能特性:电压强度决定信号大小 电器特性 :规定电压范围 过程特性:建立连接时各个相关部件的工作步骤. 2.2 通讯模型(通讯的目的是传递数据) 信息:文字/图片/视频 数据:信息在传输之前需要编码,编码之后的信息就是数据 信号:数据在通信线路上传递需要变成光信号.电信号 码元:时间间隔

物理层的基本概念

物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体. 物理层的主要任务描述为:确定与传输媒体的接口的一些特性,即: 机械特性: 例接口形状,大小,引线数目 电气特性:例规定电压范围(-5V到+5V) 功能特性:例规定-5V表示0,+5V表示1 过程特性:也称规程特性,规定建立连接时各个相关部件的工作步骤