比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 最优贸易 最终得分 100
用户昵称 Ostmbh 运行时间 0.650 s
代码语言 C++ 内存使用 2.99 MiB
提交时间 2017-05-20 21:40:41
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <queue>
  5. #include <cstring>
  6. using namespace std;
  7. vector<int>A[100001];
  8. const int INF=0x7fffffff/2;
  9. int val[100001];
  10. int maxx[100001]={0};
  11. int minn[100001]={0};
  12. int vis[100001]={0};
  13. queue<int>q;
  14. int n,m;
  15. int main(){
  16. freopen("trade.in","r",stdin);
  17. freopen("trade.out","w",stdout);
  18. cin>>n>>m;
  19. for(int i=1;i<=n;i++)
  20. cin>>val[i];
  21. int x,y,z;
  22. for(int i=1;i<=m;i++){
  23. cin>>x>>y>>z;
  24. A[x].push_back(y);
  25. if(z==2){
  26. A[y].push_back(x);
  27. }
  28. }
  29. q.push(1);
  30. maxx[1]=0;
  31. memset(minn,127,sizeof(minn));
  32. while(!q.empty()){
  33. int cd=q.front();
  34. q.pop();
  35. vis[cd]=0;
  36. for(int i=0;i<A[cd].size();i++){
  37. int u=A[cd][i];
  38. if(val[cd]<minn[u]){
  39. minn[u]=val[cd];
  40. if(!vis[u]){
  41. vis[u]=1;
  42. q.push(u);
  43. }
  44. }
  45. if(minn[cd]<minn[u]){
  46. minn[u]=minn[cd];
  47. if(!vis[u]){
  48. vis[u]=1;
  49. q.push(u);
  50. }
  51. }
  52. if(val[u]-minn[u]>maxx[u]){
  53. maxx[u]=val[u]-minn[u];
  54. if(!vis[u]){
  55. vis[u]=1;
  56. q.push(u);
  57. }
  58. }
  59. if(maxx[cd]>maxx[u]){
  60. maxx[u]=maxx[cd];
  61. if(!vis[u]){
  62. vis[u]=1;
  63. q.push(u);
  64. }
  65. }
  66. }
  67. }
  68. cout<<maxx[n]<<endl;
  69. return 0;
  70. }