ACM: 最大流 图论题 poj 1797

本文介绍了一种解决最大流问题的方法,特别关注于寻找从起点到终点的最大运输能力。通过使用SPFA算法进行流量松弛操作,确保每条边的流量不超过其容量限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                Heavy Transportation
Description
Background
Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where it is needed on which all streets can carry the weight.
Fortunately he already has a plan of the city with all streets and bridges and all the allowed weights.Unfortunately he has no idea how to find the the maximum weight capacity in order to tell his customer how heavy the crane may become. But you surely know.

Problem
You are given the plan of the city, described by the streets (with weight limits) between the crossings, which are numbered from 1 to n. Your task is to find the maximum weight that can be transported from crossing 1 (Hugo's place) to crossing n (the customer's place). You may assume that there is at least one path. All streets can be travelled in both directions.

Input

The first line contains the number of scenarios (city plans). For each city the number n of street crossings (1 <= n <= 1000) and number m of streets are given on the first line. The following m lines contain triples of integers specifying start and end crossing of the street and the maximum allowed weight, which is positive and not larger than 1000000. There will be at most one street between each pair of crossings.

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the maximum allowed weight that Hugo can transport to the customer. Terminate the output for the scenario with a blank line.

Sample Input

 1

 3 3
 1 2 3
 1 3 4
 2 3 5

Sample Output

Scenario #1:

4

题意: FJ要从1点运送东西到n点. 要求出最大的运送货物总量. (最大流)
      但是每条路的重量的有限制的.即: 最小中找最大的.

解题思路:
         1. 最大流问题. flow记录源点到当前节点的最大流.
         2. 假设u -> v 的当前流量是cur.
          松弛操作是:  int t = min(flow[u],cur);
                      if(flow[v] < t) flow[v] = t;


代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define MAX 200005
using namespace std;
const int INF = (1<<30);

struct node
{
    int u, v;
    int w;
    int next;
}edges[MAX];

int n, m;
int num;
int first[MAX];
int flow[MAX];
bool vis[MAX];

inline int min(int a,int b)
{
    return a > b ? b : a;
}

void read_graph()
{
    num = 0;
    memset(edges,0,sizeof(edges));
    memset(first,-1,sizeof(first));

    int u, v, w;    
    for(int i = 0; i < m; ++i)
    {
        scanf("%d %d %d",&u,&v,&w);
        edges[num].u = u;
        edges[num].v = v;
        edges[num].w = w;
        edges[num].next = first[u];
        first[u] = num++;
        
        edges[num].u = v;
        edges[num].v = u;
        edges[num].w = w;
        edges[num].next = first[v];
        first[v] = num++;
    }
}

int spfa()
{
    memset(vis,false,sizeof(vis));
    memset(flow,0,sizeof(flow));
    
    queue<int> qu;
    qu.push(1);
    vis[1] = true;
    flow[1] = INF;
    
    while( !qu.empty() )
    {
        int u = qu.front();
        qu.pop();
        vis[u] = false;
    
        for(int v = first[u]; v != -1; v = edges[v].next)
        {
            int k = min(flow[u],edges[v].w);  //要通过的流量与当前的限制流量比较
            if(flow[edges[v].v] < k)  //流量松弛操作
            {
                flow[edges[v].v] = k;
                if( !vis[edges[v].v] )
                {
                    vis[edges[v].v] = true;
                    qu.push(edges[v].v);
                }
            }
        }
    }
    
    return flow[n];
}

int main()
{
//    freopen("input.txt","r",stdin);
    int t = 1;
    int casesize;
    scanf("%d",&casesize);
    
    while( casesize-- )
    {
        scanf("%d %d",&n,&m);
        printf("Scenario #%d:\n",t++);
        read_graph();
        printf("%d\n\n",spfa());
        
        
    }
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值