记录编号 442717 评测结果 AAAAAAAAAA
题目名称 [NOIP 2009]最优贸易 最终得分 100
用户昵称 Gravatarliuyu 是否通过 通过
代码语言 C++ 运行时间 0.242 s
提交时间 2017-08-28 11:58:11 内存使用 17.58 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,x,y,z,a[100001],fi1[100001],ne1[1000001],w1[1000001],cnt1;
  4. int fi2[100001],ne2[1000001],w2[1000001],cnt2,maxx[100001],minn[100001],ans;
  5. bool b[100001];
  6. queue<int> q;
  7. void add1(int u,int v)
  8. {
  9. w1[++cnt1]=v;ne1[cnt1]=fi1[u];fi1[u]=cnt1;
  10. }
  11. void add2(int u,int v)
  12. {
  13. w2[++cnt2]=v;ne2[cnt2]=fi2[u];fi2[u]=cnt2;
  14. }
  15. void spfa(){
  16. q.push(1);b[1]=1;minn[1]=a[1];
  17. while(!q.empty())
  18. {
  19. int k=q.front();q.pop();b[k]=0;
  20. for(int i=fi1[k];i;i=ne1[i])
  21. {
  22. if(minn[w1[i]]>minn[k])
  23. {
  24. minn[w1[i]]=minn[k];
  25. if(!b[w1[i]])
  26. {
  27. b[w1[i]]=1;q.push(w1[i]);
  28. }
  29. }
  30. if(minn[w1[i]]>a[w1[i]])
  31. {
  32. minn[w1[i]]=a[w1[i]];
  33. if(!b[w1[i]])
  34. {
  35. b[w1[i]]=1;q.push(w1[i]);
  36. }
  37. }
  38. }
  39. }
  40. q.push(n);b[n]=1;maxx[n]=a[n];
  41. while(!q.empty())
  42. {
  43. int k=q.front();q.pop();b[k]=0;
  44. for(int i=fi2[k];i;i=ne2[i])
  45. {
  46. if(maxx[w2[i]]<maxx[k])
  47. {
  48. maxx[w2[i]]=maxx[k];
  49. if(!b[w2[i]])
  50. {
  51. b[w2[i]]=1;q.push(w2[i]);
  52. }
  53. }
  54. if(maxx[w2[i]]<a[w2[i]])
  55. {
  56. maxx[w2[i]]=a[w2[i]];
  57. if(!b[w2[i]])
  58. {
  59. b[w2[i]]=1;q.push(w2[i]);
  60. }
  61. }
  62. }
  63. }
  64. }
  65. int main()
  66. {
  67. freopen("trade.in","r",stdin);
  68. freopen("trade.out","w",stdout);
  69. scanf("%d%d",&n,&m);
  70. for(int i=1;i<=n;i++)
  71. {
  72. scanf("%d",&a[i]);minn[i]=999999999;
  73. }
  74. for(int i=1;i<=m;i++)
  75. {
  76. scanf("%d%d%d",&x,&y,&z);
  77. add1(x,y);add2(y,x);
  78. if(z==2) add1(y,x),add2(x,y);
  79. }
  80. spfa();
  81. for(int i=1;i<=n;i++)
  82. if(maxx[i]-minn[i]>ans) ans=maxx[i]-minn[i];
  83. printf("%d\n",ans);
  84. return 0;
  85. }