当前位置: 首页 > news >正文

P1073 最优贸易

tarjan + topsort(就是个DAG上的dp)

#include<iostream> 
#include<cstdio>
#include<algorithm>
using namespace std;
int price[100010];
struct node
{
    int point;
    int nxt;
};
node l1[1000010],l2[1000010];
int h1[100010],h2[100010];
int t1,t2;
int tie;
int dfn[100010],low[100010];
bool instack[100010];
int top,stack[100010];
int belong[100010];
int bcnt;
int maxn[100010],minn[100010];
int ans[100010];
int in[100010];
bool could[100010];
int s[100010],t;
void add1(int x,int y)
{
    l1[++t1].point=y;
    l1[t1].nxt=h1[x];
    h1[x]=t1;
}
void add2(int x,int y)
{
    l2[++t2].point=y;
    l2[t2].nxt=h2[x];
    h2[x]=t2;
}
void tarjan(int x)
{
    stack[++top]=x;
    instack[x]=true;
    low[x]=dfn[x]=++tie;
    for(int i=h1[x];i;i=l1[i].nxt)
    {
         int net=l1[i].point;
         if(!dfn[net])
         {
            tarjan(net);
            if(low[net]<low[x])
                low[x]=low[net];
         }
         else
         if(instack[net]&&dfn[net]<low[x])
            low[x]=dfn[net];
    }
    if(dfn[x]==low[x])
    {
        bcnt+=1;
        int pass;
        do
        {
            pass=stack[top];
            top-=1;
            belong[pass]=bcnt;
            maxn[bcnt]=max(maxn[bcnt],price[pass]);
            minn[bcnt]=min(minn[bcnt],price[pass]);
            instack[pass]=false;
        }while(pass!=x);
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        minn[i]=0x7fffffff;
    for(int i=1;i<=n;i++)
        scanf("%d",&price[i]);
    int a,b,c;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add1(a,b);
        if(c==2)
            add1(b,a);
    }
    for(int i=1;i<=n;i++)
    if(!belong[i])
        tarjan(i);
    for(int i=1;i<=n;i++)
    {
        for(int j=h1[i];j;j=l1[j].nxt)
            if(belong[i]!=belong[l1[j].point])
                {
                    in[belong[l1[j].point]]+=1;
                    add2(belong[i],belong[l1[j].point]);
                }
    }
    if(in[belong[1]])
    {
        printf("0");
        return 0;
    }
    for(int i=1;i<=bcnt;i++)
        if(!in[i])
            s[++t]=i;
    could[belong[1]]=true;
    int pass;
    while(t)
    {
        pass=s[t];
        t-=1;
        if(could[pass])
            ans[pass]=max(ans[pass],maxn[pass]-minn[pass]);
        for(int i=h2[pass];i;i=l2[i].nxt)
        {
            int net=l2[i].point;
            could[net]=max(could[net],could[pass]);
            if(could[net])
            {
                minn[net]=min(minn[net],minn[pass]);
                ans[net]=max(ans[pass],ans[net]);//dp转移
            }
            in[net]-=1;
            if(!in[net])
                s[++t]=net;
        }
    }
    printf("%d",ans[belong[n]]);
}

转载于:https://www.cnblogs.com/Lance1ot/p/8659511.html

相关文章:

  • 080.mycat和mycopy
  • [模板] LIS
  • 用户管理 useradd userdel usermod
  • canvas填充样式
  • 公钥加密—私钥签名
  • 网络应用框架Netty快速入门
  • Redux 中间件分析
  • c# yield关键字原理详解
  • 一个日期处理类库moment.js
  • 使用Kolla构建Pike版本OpenStack Docker镜像
  • spring MVC 使用 hibernate validator验证框架,国际化配置
  • Kubernetes软件包管理系统-Helm架构
  • A - 夹角有多大(题目已修改,注意读题)
  • 卸载openssl后yum无法使用,ssh无法连接的解决办法
  • 春雪
  • Google 是如何开发 Web 框架的
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • android图片蒙层
  • CSS实用技巧
  • express + mock 让前后台并行开发
  • Java到底能干嘛?
  • Laravel 实践之路: 数据库迁移与数据填充
  • Making An Indicator With Pure CSS
  • Markdown 语法简单说明
  • PHP 7 修改了什么呢 -- 2
  • PHP变量
  • Redis学习笔记 - pipline(流水线、管道)
  • redis学习笔记(三):列表、集合、有序集合
  • Redis中的lru算法实现
  • socket.io+express实现聊天室的思考(三)
  • vue脚手架vue-cli
  • 创建一个Struts2项目maven 方式
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 关于字符编码你应该知道的事情
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • gunicorn工作原理
  • 选择阿里云数据库HBase版十大理由
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (14)Hive调优——合并小文件
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (九)One-Wire总线-DS18B20
  • (万字长文)Spring的核心知识尽揽其中
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net mvc部分视图
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net知识和学习方法系列(二十一)CLR-枚举