C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。

任意两个城市之间最多只有一条道路直接相连。

这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1条。

C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。

但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。

商人阿龙来到C国旅游。

当他得知“同一种商品在不同城市的价格可能会不同”这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚一点旅费。

设C国 n 个城市的标号从 1~n,阿龙决定从1号城市出发,并最终在 n 号城市结束自己的旅行。

在旅游的过程中,任何城市可以被重复经过多次,但不要求经过所有 n 个城市。

阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。

因为阿龙主要是来C国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。

现在给出 n 个城市的水晶球价格,m 条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。

请你告诉阿龙,他最多能赚取多少旅费。

输入格式

第一行包含 2 个正整数 n 和 m,中间用一个空格隔开,分别表示城市的数目和道路的数目。

第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这 n 个城市的商品价格。

接下来 m 行,每行有 3 个正整数,x,y,z,每两个整数之间用一个空格隔开。

如果z=1,表示这条道路是城市 x 到城市 y 之间的单向道路;如果z=2,表示这条道路为城市 x 和城市 y 之间的双向道路。

输出格式

一个整数,表示答案。

数据范围

1≤n≤1000001≤n≤100000,
1≤m≤5000001≤m≤500000,
1≤各城市水晶球价格≤100


AC这道题已经是第二遍了,第一次是用别人一个叫DP的代码水过的,尽管我都不知道什么是DP;今天突然有了灵感,自己又写了一遍,用双向SPFA,第一次就过了,和大家分享一下;

#include <bits/stdc++.h>

using namespace std;

#define N 100000

inline int read()
{
int x = ,ff = ;char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-') ff = -;
ch = getchar();
}
while(isdigit(ch))
{
x = (x<<) + (x<<) + (ch ^ );
ch = getchar();
}
return x * ff;
} inline void write(int x)
{
if(x < ) putchar('-'),x = -x;
if(x > ) write(x / );
putchar(x % + '');
} int a,b,ans;
struct node
{
int y,next;
}e1[N<<],e2[N<<];
int tot1,lin1[N<<];
int tot2,lin2[N<<];
int mon[N<<],mi[N<<],ma[N<<];
int head,tail,q[N<<],vis[N<<]; void add1(int xx,int yy)
{
e1[++tot1].y = yy;
e1[tot1].next = lin1[xx];
lin1[xx] = tot1;
} void add2(int xx,int yy)
{
e2[++tot2].y = yy;
e2[tot2].next = lin2[xx];
lin2[xx] = tot2;
} void SPFA1(int s)
{
memset(vis,false,sizeof(vis));
memset(mi,0x3f,sizeof(mi));
head = ,tail = ;
q[] = s; mi[s] = mon[s];
for(head = ;head <= tail;++head)
{
int x = q[head];
vis[x] = false;
for(int i = lin1[x],y;i;i = e1[i].next)
{
if(mi[y = e1[i].y] > mi[x])
{
mi[y] = min(mon[y],mi[x]);
if(!vis[y])
{
vis[y] = true;
q[++tail] = y;
}
}
}
}
} void SPFA2(int s)
{
memset(vis,false,sizeof(vis));
head = ,tail = ;
q[] = s; ma[s] = mon[s];
for(head = ;head <= tail;++head)
{
int x = q[head];
vis[x] = false;
for(int i = lin2[x],y;i;i = e2[i].next)
{
if(ma[y = e2[i].y] < ma[x])
{
ma[y] = max(mon[y],ma[x]);
if(!vis[y])
{
vis[y] = true;
q[++tail] = y;
}
}
}
}
} int main()
{
a = read(); b = read();
for(int i = ;i <= a;++i)
mon[i] = read();
for(int i = ;i <= b;++i)
{
int x,y,z;
x = read(); y = read(); z = read();
add1(x,y);
add2(y,x);
if(z == )
{
add1(y,x);
add2(x,y);
}
}
SPFA1(); SPFA2(a);
for(int i = ;i <= a;++i)
ans = max(ans,ma[i] - mi[i]);
write(ans);
return ;
}

下面是第一次的代码,大佬可以参考一下......

#include<bits/stdc++.h>
#define INF 0x7f7f7f7f
#define MAXN 100005
using namespace std; vector<int> g[MAXN];
int n,m,f[MAXN],mi[MAXN],c[MAXN]; void dfs(int x,int minx,int pre) {
int flag=;
minx=min(c[x],minx);
if (mi[x]>minx) mi[x]=minx,flag=;
int maxx=max(f[pre],c[x]-minx);
if (f[x]<maxx) f[x]=maxx,flag=;
if (flag) return;
for (int i=;i<g[x].size();i++) dfs(g[x][i],minx,x);
} int main() {
scanf("%d%d",&n,&m);
for (int i=;i<MAXN;i++) mi[i]=INF;
for (int i=;i<=n;i++) scanf("%d",&c[i]);
for (int i=;i<=m;i++) {
int t1,t2,t3;
scanf("%d%d%d",&t1,&t2,&t3);
g[t1].push_back(t2);
if (t3==) g[t2].push_back(t1);
}
dfs(,INF,);
printf("%d\n",f[n]);
return ;
}

P1219 最优贸易的更多相关文章

  1. NOIP2009 最优贸易

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

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

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

  3. Luogu P1073 最优贸易

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

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

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

  5. CH6101 最优贸易【最短路】

    6101 最优贸易 0x60「图论」例题 描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通 ...

  6. [Luogu 1073] NOIP2009 最优贸易

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

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

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

  8. 【洛谷P1073】[NOIP2009]最优贸易

    最优贸易 题目链接 看题解后感觉分层图好像非常NB巧妙 建三层n个点的图,每层图对应的边相连,权值为0 即从一个城市到另一个城市,不进行交易的收益为0 第一层的点连向第二层对应的点的边权为-w[i], ...

  9. 洛谷P1073 最优贸易==codevs1173 最优贸易

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

随机推荐

  1. 仿htc sense的弹性listView!

    demo下载:http://pan.baidu.com/s/1ntoICdV 前一段时间换了htc m7之后,对htc的sense ui有不错的印象.特别是它的listview十分有个性.提供弹性的o ...

  2. 全文索引--自己定义chinese_lexer词典

    本文来具体解释一下怎样自己定义chinese_lexer此法分析器的词典 初始化数据 create table test2 (str1 varchar2(2000),str2varchar2(2000 ...

  3. iOS多线程编程(四)------ GCD(Grand Central Dispatch)

    一.简单介绍 是基于C语言开发的一套多线程开发机制.也是眼下苹果官方推荐的多线程开发方法.用起来也最简单.仅仅是它基于C语言开发,并不像NSOperation是面向对象的开发.而是全然面向过程的.假设 ...

  4. Linux变量内容的删除、代替与替换

    变量内容的删除与代替 范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样 [root@www ~]# path=${PATH} [root@www ~]# echo $path / ...

  5. cocos2d-x 3.0 touch事件官方解释

    官方解释 http://www.cocos2d-x.org/docs/manual/framework/native/input/event-dispatcher/zh#_1

  6. I want a mysqldump –ignore-database option

    $ time mysqldump --databases `mysql --skip-column-names -e "SELECT GROUP_CONCAT(schema_name SEP ...

  7. mysql关闭skip-grant-tables快速重置mysql密码

    如果你忘记了mysql密码几乎是没有什么好办法可以直接修改密码了,但我们可以在my.ini把加上skip-grant-tables,然后重启mysql就不需要密码了,这时我们再修改root密码,最后再 ...

  8. Boom!!!计算机系统,从理解到爆炸,Bomblab

    进入文件夹下 ./bomb 開始执行炸弹 对于炸弹command not found之类的鬼畜情况: chmod 777 bomb 然后再执行炸弹 objdump -d bomb > bomb. ...

  9. word2vec学习 spark版

    参考资料: http://ir.dlut.edu.cn/NewsShow.aspx?ID=291 http://www.douban.com/note/298095260/ http://machin ...

  10. BMP文件格式具体解释

    BMP文件格式具体解释(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统 ...