/*
中国的题目 ——贱买贵卖 0.0
这题wa了好多遍
第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点
然后统计合法的点里最大最小值 然后printf
也不知道哪里来的自信 就这么交了 然后爆零了
第二遍想了想 恩 刚开始思路有问题 必须先买后卖
买的点要在卖的前面 恩 很有道理
然后数组模拟着统计了一下i之前的最小值和i之后的最大值
并且确保每个点都是合法的
然后 连样例都不对了.....
第三遍 终于找到了问题的关键(好吧我是看到标签里有spfa才想到了)
因为他是图啊 图啊 而且是有向的 而且有双向边
这个嘛 当然还是跑一遍这个图 按照跑的顺序更新最大最小值
所以正反建边 正反分别跑最大最小就ok了
下面是wa的代码
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 500010
using namespace std;
int n,m,num,head[maxn],v[maxn],sm[maxn],bi[maxn];
bool f[maxn];
struct node
{
int v,pre;
}e[maxn*];
int init()
{
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to)
{
num++;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int s)
{
for(int i=head[s];i;i=e[i].pre)
if(f[e[i].v]==)
{
f[e[i].v]=;
Dfs(e[i].v);
}
}
void Get_sb()
{
sm[]=maxn;
for(int i=;i<=n;i++)sm[i]=min(v[i],sm[i-]);
for(int i=n;i>=;i--)bi[i]=max(v[i],bi[i-]);
}
int main()
{
n=init();m=init();
for(int i=;i<=n;i++)
v[i]=init();
int x,y,z;
for(int i=;i<=m;i++)
{
x=init();y=init();z=init();
if(z==)Add(x,y);
else Add(x,y),Add(y,x);
}
f[]=;Dfs();
Get_sb();
int minn=0x3f3f3f3f,maxx=;
for(int i=;i<=n;i++)
if(f[i])
{
minn=min(minn,bi[i]-sm[i]);
maxx=max(maxx,bi[i]-sm[i]);
}
printf("%d\n",maxx-minn);
return ;
}
/*这是Ac的代码*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 500010
using namespace std;
int n,m,num,num2,head[maxn],head2[maxn],v[maxn],dx[maxn],dy[maxn],ans;
bool f[maxn];
struct node
{
int v,pre;
}e[maxn*],e2[maxn*];
int init()
{
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to)
{
num++;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Add2(int from,int to)
{
num2++;
e2[num2].v=to;
e2[num2].pre=head2[from];
head2[from]=num2;
}
void SPFA(int s)
{
memset(dx,/,sizeof(dx));
f[s]=;dx[s]=v[s];
queue<int>q;
q.push(s);
while(!q.empty())
{
int k=q.front();q.pop();
for(int i=head[k];i;i=e[i].pre)
{
dx[e[i].v]=min(dx[e[i].v],min(v[e[i].v],dx[k]));
if(f[e[i].v]==)
{
f[e[i].v]=;
q.push(e[i].v);
}
}
}
}
void SPFA2(int s)
{
f[s]=;dy[s]=v[s];
queue<int>q;
q.push(s);
while(!q.empty())
{
int k=q.front();q.pop();
for(int i=head2[k];i;i=e2[i].pre)
{
dy[e2[i].v]=max(dy[e2[i].v],max(v[e2[i].v],dy[k]));
if(f[e2[i].v]==)
{
f[e2[i].v]=;
q.push(e2[i].v);
}
}
}
}
int main()
{
n=init();m=init();
for(int i=;i<=n;i++)
v[i]=init();
int x,y,z;
for(int i=;i<=m;i++)
{
x=init();y=init();z=init();
if(z==)Add(x,y),Add2(y,x);
else Add(x,y),Add(y,x),Add2(x,y),Add2(y,x);
}
SPFA();memset(f,,sizeof(f));SPFA2(n);
int minn=0x3f3f3f3f,maxx=;
for(int i=;i<=n;i++)
ans=max(ans,dy[i]-dx[i]);
printf("%d\n",ans);
return ;
}

codevs 1173 最优贸易(DP+SPFA运用)的更多相关文章

  1. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...

  2. 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)

    次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...

  3. 洛谷P1073 最优贸易 [图论,DP]

    题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...

  4. P1073 最优贸易 建立分层图 + spfa

    P1073 最优贸易:https://www.luogu.org/problemnew/show/P1073 题意: 有n个城市,每个城市对A商品有不同的定价,问从1号城市走到n号城市可以最多赚多少差 ...

  5. 洛谷 P1073 最优贸易 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...

  6. 洛谷 P1073 最优贸易 解题报告

    P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...

  7. NOIP2009 最优贸易

    3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...

  8. Luogu P1073 最优贸易

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...

  9. [Luogu 1073] NOIP2009 最优贸易

    [Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...

随机推荐

  1. 3.5 linux 0.11 目标文件格式

    在Linux0.11系统中,GNU gcc或gas编译输出的目标模块文件和链接程序生成的可执行文件都使用了UNIX传统的a.out格式.这是一种被称为汇编与链接输出(Assembly & li ...

  2. OOCSS学习(一)

    OOCSS —— 面向对象CSS 搜集一些该搜集的,然后汇总一下. 1.OOCSS 概念篇: 1)什么是面向对象 确定“对象”,并给这个对象创建CSS样式规则. 2)面向对象的CSS理论 OOCSS最 ...

  3. git log友好显示

    查看commit 提交日志 $ git log $git log --pretty=oneline $git reflog 显示所有提交记录,包括已经回退的提交,如图:提交了abc 和 bb 然后回退 ...

  4. Python学习笔记:03语法

    Python 语法 Python语法包括: 模块函数导入 赋值 判断循环语句 模块导入 import somemodule somemodule.somefunc from somemodule im ...

  5. 快速排序(Quick Sort)的C语言实现

    快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...

  6. LINUX搭建SVN客户端和多个项目的权限分组管理

    搭建SVN服务,有效的管理代码,以下三步可以快速搞定.1.安装 #yum install subversion 判断是否安装成功 1 #subversion -v svnserve, version ...

  7. 如何让Qt 的程序等待一段时间(等待的同时,还让主界面刷新图片)good

    后面这种方法可以不影响其他线程的响应,又可以达到等待的目的. 测试的一个小例子: class Widget : public QWidget { Q_OBJECT public: Widget(QWi ...

  8. Qt: 网络编程之UDP(理论+实例)

    http://blog.csdn.net/rl529014/article/details/52888525

  9. Android基础知识、四大组件(转)

    Android应用程序使用java语言编写的.Android SDK工具将所有的数据和资源文件以及代码进行编译,打包称为一个apk文件.一个apk文件中的所有代码被认为是一个应用,android系统的 ...

  10. OpenRisc-47-or1200的WB模块分析

    引言 “善妖善老,善始善终”,说的是无论什么事情要从有头有尾,别三分钟热度. 对于or1200的流水线来说,MA阶段是最后一个阶段,也是整条流水线的收尾阶段,负责战场的清扫工作.比如,把运算指令的运算 ...