NOIP2009 最优贸易(BFS)
本题正解是tarjan。我没有去写
之前的代码是错误的不好意思,因为数据太弱一直没有发现。
相同还是两遍bfs,一次正向,一次反向。在正向的时候我们求出从起点走到各个点的最小值。在反向的时候求出从终点走向起点的最大值。
这样一来,便能够知道对于每个点i。在1到n的路径上面,经过的最大值是多少。经过的最小值是多少。最后max(mx[i]-mp[i])就是要求的答案。
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define MAXN 100005
using namespace std;
struct T
{
int v;
int next;
}edge[500005],edge2[500005];
int cnt,cnt2;
int head[MAXN],head2[MAXN];
void add_edge(int u,int v)
{
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void add_edge2(int u,int v)
{
edge2[cnt2].v = v;
edge2[cnt2].next = head2[u];
head2[u] = cnt2++;
}
int mx[MAXN],mp[MAXN],w[MAXN];
bool able[MAXN],vis[MAXN];
int n,m;
void bfs1()
{
memset(mp,0x3f,sizeof mp);
queue<int> myque;
myque.push(1);
vis[1] = 1;
while(!myque.empty())
{
int u = myque.front();
vis[u] = 0;
myque.pop();
mp[u] = min(mp[u],w[u]);
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(mp[v] > mp[u])
{
mp[v] = mp[u];
if(!vis[v])
{
vis[v] = 1;
myque.push(v);
}
}
}
}
}
void bfs2()
{
memset(mx,0,sizeof mx);
queue<int> myque;
myque.push(n);
able[n] = 1;
while(!myque.empty())
{
int u = myque.front();
able[u] = 0;
myque.pop();
mx[u] = max(mx[u],w[u]);
for(int i = head2[u]; i != -1; i = edge2[i].next)
{
int v = edge2[i].v;
if(mx[v] < mx[u])
{
mx[v] = mx[u];
if(!able[v])
{
able[v] = 1;
myque.push(v);
}
}
}
}
}
int main()
{
memset(head,-1,sizeof head);
memset(head2,-1,sizeof head2);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d",&w[i]);
for(int i = 1; i <= m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y);
add_edge2(y,x);
if(z == 2)
{
add_edge(y,x);
add_edge2(x,y);
}
}
bfs2();//反向,找n到i路径上的最大值
bfs1();//正向,找1到i路径上的最小值
int ans = 0;
for(int i = 1; i <= n; i++)
ans = max(ans,mx[i]-mp[i]);
printf("%d\n",ans);
return 0;
}
/*4 3
10 10 1 10
1 2 1
2 4 1
3 2 1 */
NOIP2009 最优贸易(BFS)的更多相关文章
- [Luogu 1073] NOIP2009 最优贸易
[Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...
- [NOIP2009]最优贸易(图论)
[NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...
- NOIP2009 最优贸易
3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...
- 【洛谷P1073】[NOIP2009]最优贸易
最优贸易 题目链接 看题解后感觉分层图好像非常NB巧妙 建三层n个点的图,每层图对应的边相连,权值为0 即从一个城市到另一个城市,不进行交易的收益为0 第一层的点连向第二层对应的点的边权为-w[i], ...
- [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)
传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...
- NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- noip2009最优贸易
试题描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- 洛谷1073 NOIP2009 最优贸易
题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- noip2009最优贸易(水晶球)
题目:http://codevs.cn/problem/1173/ https://www.luogu.org/problemnew/show/P1073 本来考虑缩点什么的,后来发现不用. 只要记录 ...
随机推荐
- ConfigurationSection
https://msdn.microsoft.com/en-us/library/system.configuration.configurationsection(v=vs.110).aspx Re ...
- hdoj--2036--改革春风吹满地(数学几何)
改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 3.bind与仿函数以及普通函数
#include <iostream> #include <string> #include <vector> #include <algorithm> ...
- 33.unique_ptr独享内存智能指针
#include <iostream> #include <memory> #include <string> #include <vector> us ...
- 6.CPU调度
总论:所有的程序都是CPU和I/O等待交替执行 CPU调度器的操作时机 调用CPU调度器的时机,通常发生在 某一进程从执行状态转化为等待状态 某一进程从执行状态转化为就绪状态 某一进程从等待状态转为就 ...
- python 3.x 学习笔记4(函数)
1.编程方式分:面向对象.面向过程.函数式编程 2.区分面向对象---->类---->class面向过程---->过程---->def函数式编程---->函数----&g ...
- checkbox和文字不再同一水平线上
为了演示效果,我故意将文字变为12px,将复选框变大,看到的效果就是下面的那样 然后,我们通过给复选框添加vertical-align:middle:让文字和复选框达到同一水平线的效果
- ES6中object对象属性
//////es5中定义对象属性要么字面量.要么点.要么[],变量与空格在这些方法中没有得到好的支持 /////在es6中可以这么定义: let w='www'; let obj1={w};//obj ...
- vue中使用console.log无效
webpack开发环境下,在vue中使用console.log无效,一直以为webpack出了问题. 使用window.console.log()就能够顺利在浏览器控制台输出了. 以及 在axios请 ...
- TCP学习前的准备——可靠数据传输协议
由于传输层所依赖的网络层是不可靠的,通过逐渐考虑实际情况不断引入新技术来实现可靠数据传输. 完全可信的信道 有比特差错的信道 新的协议功能: 1. 差错检测:检验和 2. 接收方反馈:序号 ...