记录编号 443187 评测结果 AAAAAAAAAA
题目名称 [NOIP 2009]最优贸易 最终得分 100
用户昵称 GravatarHyoi_iostream 是否通过 通过
代码语言 C++ 运行时间 0.214 s
提交时间 2017-08-29 20:10:37 内存使用 14.14 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. #include <cmath>
  6. using namespace std;
  7. const int MAXN = 500000;
  8. int n,m,e = 1,ans,head[MAXN][2],MAX[MAXN],MIN[MAXN],Data[MAXN];
  9. bool inq[MAXN];
  10. queue<int>q;
  11. struct node{
  12. int v,next;
  13. }edge[MAXN];
  14. inline void addedge(int u,int v){
  15. edge[e].next = head[u][0];edge[e].v = v;head[u][0] = e++;
  16. edge[e].next = head[v][1];edge[e].v = u;head[v][1] = e++;
  17. }
  18. inline void init(){
  19. scanf("%d%d",&n,&m);
  20. for(int i=1;i<=n;i++)
  21. scanf("%d",&Data[i]),MIN[i]=105;
  22. int u,v,k;
  23. for(int i=1;i<=m;i++){
  24. scanf("%d%d%d",&u,&v,&k);
  25. addedge(u,v);
  26. if(k==2) addedge(v,u);
  27. }
  28. }
  29.  
  30. inline void spfa_1(){
  31. q.push(1);inq[1]=true;
  32. MIN[1]=Data[1];
  33. while(!q.empty()){
  34. int x=q.front();q.pop();
  35. inq[x]=false;
  36. for(int i=head[x][0];i;i=edge[i].next){
  37. int v=edge[i].v;
  38. if(MIN[v]>MIN[x]||MIN[v]>Data[v]){
  39. MIN[v]=min(MIN[x],Data[v]);
  40. if(!inq[v]) q.push(v),inq[v]=true;
  41. }
  42. }
  43. }
  44.  
  45. }
  46.  
  47. inline void spfa_2(){
  48. q.push(n);inq[n]=true;
  49. MAX[n]=Data[n];ans=max(ans,MAX[n]-MIN[n]);
  50. while(!q.empty()){
  51. int x=q.front();q.pop();
  52. inq[x]=false;
  53.  
  54. for(int i=head[x][1];i;i=edge[i].next){
  55. int v=edge[i].v;
  56. if(MAX[v]<MAX[x]||MAX[v]<Data[v]){
  57. MAX[v]=max(MAX[x],Data[v]);
  58. ans=max(MAX[v]-MIN[v],ans);
  59. if(!inq[v]) q.push(v),inq[v]=true;
  60. }
  61. }
  62. }
  63. }
  64.  
  65. int main(){
  66. freopen("trade.in","r",stdin);
  67. freopen("trade.out","w",stdout);
  68. init();
  69. spfa_1();
  70. memset(inq,0,sizeof(inq));
  71. spfa_2();
  72. printf("%d\n",ans);
  73. fclose(stdin);
  74. fclose(stdout);
  75. return 0;
  76. }