`
huyifan951124
  • 浏览: 82893 次
社区版块
存档分类
最新评论

CSU1506 最小费用最大流

阅读更多

题目大意:给你一张图,一个人走过之后路径的费用会增加,问有2个人走,最小的总费用是多少。

算法思路:一开始准备跑2遍dijkstra,每次求最小的费用,不知道为什么这样一直WA,最后问了一下别人,发现是用最小费用最大流,每个点之间连接2条边,一条是走之前正常的路,另一条是走完这条路后增加了费用的路,因为有2个人,因此超级源点与起点的容量为2,超级汇点与终点的容量为2,跑一遍最小费用最大流的模板就可以。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define MAXN 10000
#define MAXM 100000
#define INF 0x3f3f3f3f
struct Edge
{
    int u;
    int v;
    int cap;
    int cost;
    int flow;
};
Edge edges[MAXM];
int n,m,a,b,c,add,e,ans,s,t;
int pre[MAXN];
int head[MAXN],nnext[MAXM],dist[MAXN];
bool visited[MAXN];
void addEdge(int u,int v,int cap,int cost)
{

    edges[e].v=v;
    edges[e].cap=cap;
    edges[e].cost=cost;
    edges[e].flow=0;
    nnext[e]=head[u];
    head[u]=e++;

    edges[e].v=u;
    edges[e].cap=0;
    edges[e].cost=-cost;
    edges[e].flow=0;
    nnext[e]=head[v];
    head[v]=e++;
}
bool spfa(int src, int x)
{
    queue<int>q;
    for(int i = src; i <=x; i++)
    {
        dist[i] = INF;
        visited[i] = false;
        pre[i] = -1;
    }
    dist[src] = 0;
    visited[src] = true;
    q.push(src);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        visited[u] = false;
        for(int i = head[u]; i!=-1; i=nnext[i])
        {
            int v = edges[i].v;
            if(edges[i]. cap > edges[i].flow &&
                    dist[v] > dist[u] + edges[i].cost )
            {
                dist[v] = dist[u] + edges[i].cost;
                pre[v] = i;
                if(!visited[v])
                {
                    visited[v] = true;
                    q.push(v);
                }
            }
        }
    }
    if(pre[x] == -1)
        return false;
    return true;
}
int min_cost_max_flow()
{
    int minflow=0;
    while(spfa(s,t))
    {
        int sum=INF,p=0;
        for(int i=pre[t]; i+1; i=pre[edges[i^1].v])
        {
            sum=min(sum,edges[i].cap-edges[i].flow);
        }

        for(int i=pre[t]; i+1; i=pre[edges[i^1].v])
        {
            edges[i].flow+=sum;
            edges[i^1].flow-=sum;
            ans+=sum*edges[i].cost;

        }
        minflow+=sum;

    }
    return ans;
}
int main()
{

    int cas=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        cas++;
        e=0;
        ans=0;
        memset(head,-1,sizeof(head));
        memset(nnext,-1,sizeof(nnext));
        s=0;
        t=n+1;

        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d%d",&a,&b,&c,&add);
            addEdge(a,b,1,c);
            addEdge(a,b,1,c+add);
        }
        addEdge(s,1,2,0);
        addEdge(n,t,2,0);
        printf("Case %d: %d\n",cas,min_cost_max_flow());

    }



    return 0;
}


 

0
0
分享到:
评论

相关推荐

    DS_CSU8RP1185D_V1.2_cn_csu8rp1185_CSU8RP1185D芯片用户手册_CSU8RP1185D_

    《芯海科技CSU8RP1185D:国产36引脚8位OTP ROM单片机详解》 在当今快速发展的电子科技领域,国产芯片的崛起日益显著,其中芯海科技(CHipsea Technologies)推出的CSU8RP1185D是一款备受瞩目的36引脚8位OTP ROM...

    芯海CSU32MX10系列DEMO程序_CSU32MX10_C++_troopseh6_芯海_DEMO_

    在本DEMO程序中,我们关注的是芯海的CSU32MX10系列微控制器(MCU),这是一个专为各种嵌入式应用设计的高效能、低功耗的器件。该DEMO程序是基于C++语言编写的,这表明芯海CSU32MX10支持高级编程语言,为开发者提供了...

    FORTOCSU_IDE__CSU-IDE软件使用教程_芯海_

    **FORTOCSU_IDE__CSU-IDE软件使用教程_芯海_** 这篇教程将详细介绍芯海科技推出的集成开发环境(Integrated Development Environment,简称IDE)——CSU-IDE的使用方法。作为一款专为芯海芯片设计的开发工具,CSU-...

    DS_CSU18M88_V3.4_CN_csu18m88_

    《CSU18M88芯片详解》 CSU18M88是一款高性能、低功耗的微控制器,广泛应用于各类嵌入式系统中。本文将深入探讨该芯片的资源特性,帮助开发者全面理解其功能和应用潜力。 首先,CSU18M88的核心是基于ARM Cortex-M8...

    CSU8RF3112

    CSU8RF3112是一款8位单片机微控制器(MCU),其特点在于内置了1K×16位的程序存储器E2PROM、96字节的数据存储器(SRAM),以及54字节的E2PROM用于数据存储。此外,它拥有总共只有43条单字指令,并具备6级存储堆栈。CSU8...

    CSU8RF3111文档

    芯海科技的CSU8RF3111是一款高性能、低功耗的8位微控制器,专门设计用于处理各类嵌入式应用。该芯片集成了先进的FLASH存储器,使其在程序存储和数据存储方面具有较大的灵活性。下面我们将深入探讨这款芯片的一些关键...

    CSU8ASM-IDE

    CSU8ASM-IDE是一款专为CSU8ASM汇编语言设计的集成开发环境(IDE),版本号为1.3.5。这个IDE是程序员编写、调试和优化CSU8ASM代码的重要工具,旨在提高开发效率和代码质量。在本文中,我们将详细探讨这款IDE的功能...

    CSU8RF2112

    CSU8RF2111/CSU8RF2112是一款8位单片机MCU,具备以下技术特点和知识点: 1. 8位单片机MCU:CSU8RF2111/CSU8RF2112采用8位微控制器架构,这意味着它的处理器以8位数据为单位进行操作和处理,适合用于控制任务不是...

    CSU8ASM-IDE开发编译软件

    CSU8ASM-IDE是一款专为CSU8ASM汇编语言设计的集成开发环境(IDE),它集成了代码编辑、编译、调试等多种功能,旨在提高程序员的开发效率和代码质量。这款软件对于学习和使用CSU8ASM汇编语言的用户来说是一个不可或缺...

    CSU Face Identification Evaluation System

    "CSU Face Identification Evaluation System" 是一款专门用于人脸识别评估的专业工具,由 Colorado State University(CSU)开发。这个系统提供了全面的评测方法,旨在衡量人脸识别算法的性能和准确性。在人脸识别...

    CSU8000_3.16_6251.EXE

    许继CSU8000远动软件

    芯海芯片CSU8RF3111资料

    本文将深入探讨芯海芯片CSU8RF3111的相关知识,包括其功能特性、应用范围以及开发工具。 CSU8RF3111是一款基于AD型FLASH MCU(微控制器)的高性能芯片,适用于需要高效能、低功耗特性的应用场景。这款芯片集成了高...

    CSU18P88用户手册-V1.2.pdf

    【标题】:"CSU18P88用户手册-V1.2.pdf" 【描述】:"电子秤、小家电使用" 从标题和描述中可以提取以下知识点: 1. CSU18P88是一种用户手册中提及的特定型号的产品。 2. 该产品主要面向的使用领域是电子秤和小家电。 ...

    C语言课件教程 CSU

    《C语言课件教程 CSU》是一份专为初学者设计的C语言学习资源,涵盖了C语言的基础到进阶知识,旨在帮助学习者系统地掌握这门编程语言。本教程由CSU(假设是某大学的缩写)的教师编写,具有较高的教学价值和实用性,...

    专用芯片技术中的基于CSU8RP3125芯片的电子烟解决方案

    本文介绍了芯海科技有限公司OTP芯片CSU8RP3125应用于电子烟上的解决方案,该方案采用芯片内置的±1%精度的16MHZ的高速PWM时钟源,可在宽频率范围内灵活控制LED呼吸灯的变化,同时内置的12 Bit 1%测量误差的高精度ADC...

    CSU8RF311X (CSU8RF3111)芯海单片机示例代码

    本程序由芯海科技有限公司技术人员编写而成。该程序仅用于芯片功能的简单测试及作为该款芯片程序设计的入门参考。程序仅在有限的环境下测试并通过测试。若您有意调用该程序进行生产活动,请务必进行更加细致的设计和...

    模拟电子技术CSU课件

    《模拟电子技术》是电子工程领域的一门基础课程,涵盖了半导体器件、基本放大电路和功率放大电路等核心内容。在本课件中,我们将重点探讨这些主题,旨在帮助学习者理解并掌握模拟电子技术的基本原理和应用。...

    芯海MCU开发工具选型手册_CSU8ICE具体特性_芯海_CSU8开发工具简介_芯海MCU开发工具选型手册_源码

    本文将详细介绍芯海科技针对8位MCU的开发工具,包括CSU8ICE的具体特性、CSU8开发工具简介以及芯海MCU开发工具的选型手册。 首先,让我们关注CSU8ICE,即芯海8位MCU的嵌入式ICE(In-Circuit Emulator)。这是一款为...

    Java CSU 课件教程

    第一章 程序设计概述 第二章 Java语言概述 第三章 Java基本语法 第四章 Java语句及其控制结构 第五章 面向对象编程 第六章 类的继承性与多态性 第七章 包、接口和异常 其它章节简介略 版权归制作老师所有,仅供...

    DS_CSU8RP1186_V1.0_En.pdf

    芯海CSU8RP1186是一款基于一次性可编程只读存储器(OTPROM)的8位RISC单片机。这款单片机具有高性能的RISC架构,拥有36个引脚,并内置了4K×16位的OTPROM。CSU8RP1186的CPU核心基于8位SCM微控制器,拥有256字节的SRAM...

Global site tag (gtag.js) - Google Analytics